import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.security.*; public static final String ECB_PKCS1_PADDING = "RSA/ECB/NoPadding"; public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding"; public static final String ECB_PKCS1_PADDING = "RSA/ECB/OAEPWithSHA-1AndMGF1Padding"; public static final String ECB_PKCS1_PADDING = "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";
public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception { // 得到私钥 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey); KeyFactory kf = KeyFactory.getInstance(RSA); PrivateKey keyPrivate = kf.generatePrivate(keySpec); // 解密数据 Cipher cp = Cipher.getInstance(ECB_PKCS1_PADDING); cp.init(Cipher.DECRYPT_MODE, keyPrivate); byte[] arr = cp.doFinal(encrypted); return arr; }
其中 ECB_PKCS1_PADDING ="RSA/ECB/OAEPWithSHA-256AndMGF1Padding"上述的decryptByPrivateKey方法不可用,会出现解密不成功,其他的补位方式都可以采用上述的函数。
如下图所示:
纠正后的正确的写法如下:
public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception { OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey); KeyFactory kf = KeyFactory.getInstance(RSA); PrivateKey keyPrivate = kf.generatePrivate(keySpec); // 解密数据 Cipher cp = Cipher.getInstance("RSA/ECB/OAEPPadding"); cp.init(Cipher.DECRYPT_MODE, keyPrivate,oaepParameterSpec); byte[] arr = cp.doFinal(encrypted); return arr; }
其他的写法也类似,公钥加密也需要采用同样的方式进行处理。
示例代码:
{ PrivateKey mPrivatekey ;//获取私钥 byte[] encryptBytes =null;//待解密的数据 byte[] decryptBytes = decryptByPrivateKey(encryptBytes , mPrivatekey.getEncoded()); }