Java解密AWS导出的密码加密私钥时遇DerValue构造异常
解密AWS导出的加密私钥时
java.io.IOException: extra data given to DerValue constructor的解决方法 你遇到的异常是因为直接将带PEM头尾标记的私钥字符串传入EncryptedPrivateKeyInfo导致的——这个类要求输入的是DER编码的原始字节数据,而AWS导出的私钥是PEM格式:它是DER数据经过Base64编码后,加上-----BEGIN ENCRYPTED PRIVATE KEY-----和-----END ENCRYPTED PRIVATE KEY-----头尾,再换行分割的文本格式。直接把这种文本转成字节传入,会包含头尾标记、换行符这些无关数据,导致DER解析失败。
修正步骤:
- 清理PEM字符串:去掉头尾标记行,同时移除所有换行符
- 将清理后的Base64字符串解码为DER格式的字节数组
- 用处理后的DER字节初始化
EncryptedPrivateKeyInfo
修正后的代码示例:
import java.util.Base64; import java.security.spec.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; PrivateKey decryptEncryptedPrivateKey(String pemEncryptedKey, String passwd) { try { // 清理PEM格式的私钥字符串 String cleanedKey = pemEncryptedKey .replace("-----BEGIN ENCRYPTED PRIVATE KEY-----", "") .replace("-----END ENCRYPTED PRIVATE KEY-----", "") .replaceAll("\\s+", ""); // 移除所有换行、空格等空白字符 // Base64解码成DER字节数组 byte[] derBytes = Base64.getDecoder().decode(cleanedKey); // 初始化EncryptedPrivateKeyInfo并解密 EncryptedPrivateKeyInfo encryptPKInfo = new EncryptedPrivateKeyInfo(derBytes); Cipher cipher = Cipher.getInstance(encryptPKInfo.getAlgName()); PBEKeySpec pbeKeySpec = new PBEKeySpec(passwd.toCharArray()); SecretKeyFactory secFac = SecretKeyFactory.getInstance(encryptPKInfo.getAlgName()); Key pbeKey = secFac.generateSecret(pbeKeySpec); AlgorithmParameters algParams = encryptPKInfo.getAlgParameters(); cipher.init(Cipher.DECRYPT_MODE, pbeKey, algParams); KeySpec pkcs8KeySpec = encryptPKInfo.getKeySpec(cipher); KeyFactory kf = KeyFactory.getInstance("RSA"); return kf.generatePrivate(pkcs8KeySpec); } catch (Exception e) { e.printStackTrace(); return null; } }
如果你的私钥字符串里包含其他注释或额外换行,replaceAll("\\s+", "")会一并移除所有空白字符,确保Base64解码的正确性。
内容的提问来源于stack exchange,提问作者KTB
相关产品推荐
相关产品推荐

