Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java OpenSSLRSAPrivateCrtKey转换为PKCS1格式_Java_Encryption_Private Key_Pkcs#8_Pkcs#1 - Fatal编程技术网

如何将java OpenSSLRSAPrivateCrtKey转换为PKCS1格式

如何将java OpenSSLRSAPrivateCrtKey转换为PKCS1格式,java,encryption,private-key,pkcs#8,pkcs#1,Java,Encryption,Private Key,Pkcs#8,Pkcs#1,密文 i5SvmG2TbtZfkWdwJ5qeaYzvLlQknY3uMvZxSEwhBdRcXKHjgzrRk6XLDCEG9ZtZDGDA7iB3tFhLPMisfqGZvSSrcBfiV8b71+qzWVDNW9EedVShk6kaeEN6rw4UgVi6P5PvrDMn6pmYmLWCjtuFWrmboCvvYgI+FJurhlbsQESkA5oDYirjS8L0wnsQB/TnnQ5UPY2xfOBdY2MJpUSTyIjJPhI40GST8YWjXEMkJeDV/1zuKuK55RH

密文

i5SvmG2TbtZfkWdwJ5qeaYzvLlQknY3uMvZxSEwhBdRcXKHjgzrRk6XLDCEG9ZtZDGDA7iB3tFhLPMisfqGZvSSrcBfiV8b71+qzWVDNW9EedVShk6kaeEN6rw4UgVi6P5PvrDMn6pmYmLWCjtuFWrmboCvvYgI+FJurhlbsQESkA5oDYirjS8L0wnsQB/TnnQ5UPY2xfOBdY2MJpUSTyIjJPhI40GST8YWjXEMkJeDV/1zuKuK55RHCDF5AdTMEvgvvRnGhN2Fzh+rsDziHqVS9d8FmrtjdU445F6ki0d8DkaeFfrofptxGIncqfuukKSXpSp4cPLvM3LxtRvp+Aw==
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(2048);
KeyPair kp2 = kpg.generateKeyPair();
            generatedPub = kp2.getPublic();
            generatedPvt = kp2.getPrivate();

public String rsaDecrypt(String encrypted) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, generatedPvt);
            byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted.getBytes()));
            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
要解密的代码

i5SvmG2TbtZfkWdwJ5qeaYzvLlQknY3uMvZxSEwhBdRcXKHjgzrRk6XLDCEG9ZtZDGDA7iB3tFhLPMisfqGZvSSrcBfiV8b71+qzWVDNW9EedVShk6kaeEN6rw4UgVi6P5PvrDMn6pmYmLWCjtuFWrmboCvvYgI+FJurhlbsQESkA5oDYirjS8L0wnsQB/TnnQ5UPY2xfOBdY2MJpUSTyIjJPhI40GST8YWjXEMkJeDV/1zuKuK55RHCDF5AdTMEvgvvRnGhN2Fzh+rsDziHqVS9d8FmrtjdU445F6ki0d8DkaeFfrofptxGIncqfuukKSXpSp4cPLvM3LxtRvp+Aw==
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(2048);
KeyPair kp2 = kpg.generateKeyPair();
            generatedPub = kp2.getPublic();
            generatedPvt = kp2.getPrivate();

public String rsaDecrypt(String encrypted) {
        try {
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, generatedPvt);
            byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted.getBytes()));
            return new String(original);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
错误

javax.crypto.BadPaddingException:错误:0400089:RSA例程:OPENSSL\u内部:PKCS\u解码\u错误

另外,如果我尝试将私钥打印为:

generatedPvt.toString()
我得到以下信息:

OpenSSLRSAPrivateCrtKey{modulus=c7544bf521bbdd7db52dd28bd3c6f694214dc2356b905edd2730b631d11be9aea703692c2db690e6725da65737b5ec511c13668d1735bfbbc2519e0d33a67b41b289bae6ea71903af91e4f12c6e8660614ef12cd439293a0a38f564fd8f19a3e38f9e2defa269d0bcf0f53159bba1b4fd539ad934fb691e860113be53901de5a10d0c0e3ceaec3715841bc6e56b7738336e8df95a989b61175b06d70d349dcb4a031acf5b25647a1d77f6e6e11efc66e98bb321430f148a63c103a0a59e94b147a4fb49a9ecb0b23603a6ceed6e6e298650667cd61de71455bd4f95767444d89bcf485cc47a297b5306a60a14f77a3fbc19552c5fddfa5cfa2e68020e245ad91,publicExponent=10001}
当我期待PKCS#8格式的密钥被打印出来时。如何以PKCS#8格式打印密钥

为什么会出现如上所示的填充错误

byte[] original = cipher.doFinal(encrypted.getBytes());
从加密和解密方法中删除Base64.decodeBase64

如果要将键转换为字符串,请使用

String keyString= Base64.encodeBase64String(key.getEncoded());
RSA实现

 public static void main(String[] args) {
    try {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        kpg.initialize(2048);
        KeyPair kp2 = kpg.generateKeyPair();
        PublicKey publicKey = kp2.getPublic();
        PrivateKey privateKey = kp2.getPrivate();
        NewClass nc = new NewClass();
        byte[] encrypt=nc.rsaEncrypt("hi",publicKey);
        byte[] decrypt=nc.rsaDecrypt(encrypt,privateKey);
        String decryptString = new String(decrypt);
        System.out.println("decryptString = " + decryptString);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
    }

}

public byte[] rsaDecrypt(byte[] encrypted,PrivateKey privateKey) {
    try {

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] original = cipher.doFinal(encrypted);
        return original;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

public byte[] rsaEncrypt(String message,PublicKey publicKey) {
    try {

        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] original = cipher.doFinal(message.getBytes());
        return original;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}
当编码和解码与加密和解密一起完成时,顺序必须为

加密

cipher.doFinal(Base64.encodeBase64(message.getBytes()));
解密

Base64.decodeBase64(cipher.doFinal(cipher.getBytes()));

但是我为什么要删除base64解码@SREEJITH您试图使用Base64对非Base64的内容进行解码。解码会导致填充错误例外。密文显然是Base64编码的,因此是的,必须首先对其进行Base64解码。如果密文编码正确,则必须在doFinal()之后进行解码。。。。Base64.decodeBase64(cipher.doFinal(message.getBytes());您不能生成新的RSA密钥并使用它来解密某些内容。必须使用与用于加密数据的公钥对应的私钥。