首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用RSA算法加密公钥字符串-- Java中的无效密钥格式异常

使用RSA算法加密公钥字符串-- Java中的无效密钥格式异常
EN

Stack Overflow用户
提问于 2022-02-16 17:23:45
回答 1查看 385关注 0票数 1

我试图用java中的公钥使用RSA加密字符串。面对像"java.security.InvalidKeyException: invalid key format"这样的异常

部分公钥:

代码语言:javascript
运行
复制
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA993qkLy6s+EL5SQ7vqmZ
LBZEV0/tc7T5x8yRJwN0WmWy2TxOnxjFuLvO2b9ai3aEe7X5a6jzl5aE99RXbo86
IB2PDH1dDN+W2IKfQViRyZE8hKRZnLH+QEbbRr3a
x/EVAnC/cObCKgjNY4jp30sCAwEAAQxxxxxxxx==
-----END PUBLIC KEY-----

注意:公钥是从客户端生成和获取的。

代码:

代码语言:javascript
运行
复制
    package com.Test.in;
    
    
    import java.security.KeyFactory;
    import java.security.PublicKey;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;
    import javax.crypto.Cipher;
    
    
    public class RSA_PublicKey {
        public static final String NEW_LINE_CHARACTER = "\n";
        public static final String PUBLIC_KEY_START_KEY_STRING = "-----BEGIN PUBLIC KEY-----";
        public static final String PUBLIC_KEY_END_KEY_STRING = "-----END PUBLIC KEY-----";
        public static final String EMPTY_STRING = "";
public static final String NEW_CR_CHARACTER = "\r";
        private static final String ALGORITHM = "RSA";
        
        public static void main(String[] args) {
             String pub_Key="-----BEGIN PUBLIC KEY-----\r\n" + 
                "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA993qkLy6s+EL5SQ7vqmZ\r\n" + 
                "LBZEV0/tc7T5x8yRJwN0WmWy2TxOnxjFuLvO2b9ai3aEe7X5a6jzl5aE99RXbo86\r\n" + 
                "IB2PDH1dDN+W2IKfQViRyZE8hKRZnLH+QEbbRr3a\r\n" + 
                "x/EVAnC/cObCKgjNY4jp30sCAwEAAQxxxxxxxx==\r\n" + 
                "-----END PUBLIC KEY-----";
             pub_Key=pub_Key.replaceAll(NEW_LINE_CHARACTER, EMPTY_STRING)
                        .replaceAll(PUBLIC_KEY_START_KEY_STRING, EMPTY_STRING)
                        .replaceAll(PUBLIC_KEY_END_KEY_STRING, EMPTY_STRING).replaceAll(NEW_CR_CHARACTER, EMPTY_STRING);
            
            byte[] publicKey  = pub_Key.getBytes();
            try {
                byte[] encryptedData = encrypt(publicKey,
                        "hi this is Visruth here".getBytes());
                
                String encryptedString = Base64.getEncoder().encodeToString(encryptedData);
                
                System.out.println("Output encryptedString: " + encryptedString);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public static byte[] encrypt(byte[] publicKey, byte[] inputData)
                throws Exception {
    
            PublicKey key = KeyFactory.getInstance(ALGORITHM)
                    .generatePublic(new X509EncodedKeySpec(publicKey));
    
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, key);
    
            byte[] encryptedBytes = cipher.doFinal(inputData);
    
            return encryptedBytes;
        }
    }

像下面这样面对异常。

代码语言:javascript
运行
复制
java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format
    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(Unknown Source)
    at java.security.KeyFactory.generatePublic(Unknown Source)
    at com.cts.in.Test.RSA_PublicKey.encrypt(RSA_PublicKey.java:63)
    at com.cts.in.Test.RSA_PublicKey.main(RSA_PublicKey.java:44)
Caused by: java.security.InvalidKeyException: invalid key format
    at sun.security.x509.X509Key.decode(Unknown Source)
    at sun.security.x509.X509Key.decode(Unknown Source)
    at sun.security.rsa.RSAPublicKeyImpl.<init>(Unknown Source)
    at sun.security.rsa.RSAKeyFactory.generatePublic(Unknown Source)
    ... 4 more

参考链接1

参考链接2

我可以知道实现这个用例的方法(用公钥加密使用RSA的字符串)吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 08:18:09

根据上面的建议,我尝试删除\r,并对公钥字符串执行base64 64解码,得到加密的值。

工作守则:

代码语言:javascript
运行
复制
package com.Test.in;
    
    
    import java.security.KeyFactory;
    import java.security.PublicKey;
    import java.security.spec.X509EncodedKeySpec;
    import java.util.Base64;
    import javax.crypto.Cipher;
    
    
    public class RSA_PublicKey {
        public static final String NEW_LINE_CHARACTER = "\n";
        public static final String PUBLIC_KEY_START_KEY_STRING = "-----BEGIN PUBLIC KEY-----";
        public static final String PUBLIC_KEY_END_KEY_STRING = "-----END PUBLIC KEY-----";
        public static final String EMPTY_STRING = "";
        public static final String NEW_CR_CHARACTER = "\r";
        private static final String ALGORITHM = "RSA";
        public static String secretMessage  = "Some random words in no particular order.";
        
        public static void main(String[] args) {
             String pub_Key="-----BEGIN PUBLIC KEY-----\r\n" + 
                "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA993qkLy6s+EL5SQ7vqmZ\r\n" + 
                "LBZEV0/tc7T5x8yRJwN0WmWy2TxOnxjFuLvO2b9ai3aEe7X5a6jzl5aE99RXbo86\r\n" + 
                "IB2PDH1dDN+W2IKfQViRyZE8hKRZnLH+QEbbRr3a\r\n" + 
                "x/EVAnC/cObCKgjNY4jp30sCAwEAAQxxxxxxxx==\r\n" + 
                "-----END PUBLIC KEY-----";
             pub_Key=pub_Key.replaceAll(NEW_LINE_CHARACTER, EMPTY_STRING)
                        .replaceAll(PUBLIC_KEY_START_KEY_STRING, EMPTY_STRING)
                        .replaceAll(PUBLIC_KEY_END_KEY_STRING, EMPTY_STRING)
                        .replaceAll(NEW_CR_CHARACTER, EMPTY_STRING);
            
            byte[] publicKey = Base64.getDecoder().decode(pub_Key.getBytes());
            try {
                byte[] encryptedData = encrypt(publicKey,
                        secretMessage.getBytes());
                
                String encryptedString = Base64.getEncoder().encodeToString(encryptedData);
                
                System.out.println("Output encryptedString: " + encryptedString);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        public static byte[] encrypt(byte[] publicKey, byte[] inputData)
                throws Exception {
    
            PublicKey key = KeyFactory.getInstance(ALGORITHM)
                    .generatePublic(new X509EncodedKeySpec(publicKey));
    
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, key);
    
            byte[] encryptedBytes = cipher.doFinal(inputData);
    
            return encryptedBytes;
        }
    }

输出encryptedString:

代码语言:javascript
运行
复制
Vu+8qX6X+pvLGteVdPjXjBEVaAvj0g1nposgzb/EBbFZOQnpIHXkXAg3DWvH/RGMDsFL/Ae+EsXzt56eqGEW4Xw2Z5M1igkGCngIXsBmmbutD/huacOORmOvDEgYs9+a0bZms2UWlrnNS7MnC6R+WD/6P4PdIOrxAaNVEvDwOWyDGNvQaL1uR/e1YXdCr8hItr2rj+Xy88jufcFcp0HtDcFdEfK4VwPp5aehAGqE/pwqvHOgfzthW2yXjap5BHLzqdnY3fKv8pcY8b5kSamRwBMfeyiorRMt6/HCGedi7rqjH3lNlUgOObtAfNbTCtLWOia1TafHRqDa5J5AkQ/s0TpExhNem534MbwT1OMXGGWU81MzAYsBACt1CY0/kkSH6NqGvI4ZuLjki8tyu+Vpz1l2cRTbwX26gNkk1Ah55P3ub/w+zGHFuDLtRT+No/SzR+9FD95oJOu/K8RTXVaiYfY2iWOyRplTXJ4i7wfWVgLvKMJJp9MRd5D5ru4Qsa+2KVf9COwhqatWPPeVF4qnfLmOF7Gf6RxMsBTi3u74b9BHH6AtCJGR/qh67yjN0MrLp7utskLDhR22ex6RdF+OuhV2OVeo7Ez3uTsNxJ1Y+Qyda3HaoVMO3d4SPL7Fnb/9eEWbf9gMR4xZ/JrKDssRC/TDLkaGS0cMMHZ+k6vCo+0=
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71146486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档