RSA 私钥解密给出 "InvalidCipherTextException" 使用充气城堡
RSA private Key decryption giving "InvalidCipherTextException" using bouncy castle
我正在为 j2me 使用充气城堡创建一个 encryption/decryption 方法。我已经使用 openssl 和硬编码创建了私有 / public 密钥。加密工作正常(我正在获取加密字符串),但是当我尝试对该密文进行解密时,我遇到了以下异常
org.bouncycastle.crypto.InvalidCipherTextException: unknown block type
- org.bouncycastle.crypto.encodings.PKCS1Encoding.decodeBlock(PKCS1Encoding.java:362)
- org.bouncycastle.crypto.encodings.PKCS1Encoding.processBlock(PKCS1Encoding.java:166)
- com.ust.CryptoJ2me.RSADecrypt(CryptoJ2me.java:564)
PFB 代码片段
public byte[] RSAEncrypt(byte[] toEncrypt) throws Exception {
String cipherStr;
String modStr ="AA878F0D9........";
String expStr = "10001";
BigInteger modulus = new BigInteger(modStr,16);
BigInteger exponent = new BigInteger(expStr,16);
System.out.println("modulus = "+modulus+"// exponent = "+exponent);
RSApubKey = new RSAKeyParameters(false,modulus,exponent);
if (RSApubKey == null)
throw new Exception("Generate RSA keys first!");
AsymmetricBlockCipher eng = new RSAEngine();
eng = new PKCS1Encoding(eng);
eng.init(true, RSApubKey);
byte[] cipherByte = eng.processBlock(toEncrypt, 0, toEncrypt.length);
return cipherByte;//cipherStr;
}
public String RSADecrypt (byte[] toDecrypt) throws Exception {
System.out.println("toDecrypt = "+toDecrypt);
//byte[] toDecByte = toDecrypt.getBytes("UTF-8");
//System.out.println("toDecByte ="+toDecByte);
String plainText;
BigInteger RSAmod = new BigInteger("00d1aec38b8d189a0a1..",16);
BigInteger RSAprivExp = new BigInteger("2d7af1b1283688dadc16..",16);
BigInteger RSApubExp = new BigInteger("10001",16);
BigInteger RSAdp = new BigInteger("00f5847cc67ea018f10f16..",16);
BigInteger RSAdq = new BigInteger("00daa299bf356c6c6db6a21..",16);
BigInteger RSAp = new BigInteger("00e28dd601e878dd6b1c0c..",16);
BigInteger RSAq = new BigInteger("400ff2e2df018507e4c2be6..",16);
BigInteger RSAqInv = new BigInteger("00cf4b2ba101efb2378aee..",16);
RSAPrivateCrtKeyParameters RSAprivKey = new RSAPrivateCrtKeyParameters(RSAmod, RSApubExp,
RSAprivExp, RSAp, RSAq, RSAdp, RSAdq, RSAqInv);
AsymmetricBlockCipher eng = new RSAEngine();
eng = new PKCS1Encoding(eng);
eng.init(false, RSAprivKey);
byte[] plainByte = eng.processBlock(toDecrypt, 0, toDecrypt.length);
plainText = new String(plainByte);
return plainText;
}
public 密钥和私钥之间的模数不匹配。它应该匹配。私钥模数可能更小(假设大端表示法和相同长度的十六进制字符串),这就是您收到此错误消息的原因。由于私钥包含模数和public指数部分,您可以在加密代码中替换它们,看看解密是否可以使用新的密文。
RSA 的工作原理是将一些消息提升为 e(public 指数)模 m 的幂。这导致密文小于 m,但接近它。解密的工作原理是将密文提高到 d(私有指数)模 m(相同模数)的幂。
如果私钥模数远小于public密钥模数,则密文会更大,无法解密。从数学上讲,可以 "decrypt" 密文,但您不会得到原始明文。图书馆可能会就此警告您。
我正在为 j2me 使用充气城堡创建一个 encryption/decryption 方法。我已经使用 openssl 和硬编码创建了私有 / public 密钥。加密工作正常(我正在获取加密字符串),但是当我尝试对该密文进行解密时,我遇到了以下异常
org.bouncycastle.crypto.InvalidCipherTextException: unknown block type
- org.bouncycastle.crypto.encodings.PKCS1Encoding.decodeBlock(PKCS1Encoding.java:362)
- org.bouncycastle.crypto.encodings.PKCS1Encoding.processBlock(PKCS1Encoding.java:166)
- com.ust.CryptoJ2me.RSADecrypt(CryptoJ2me.java:564)
PFB 代码片段
public byte[] RSAEncrypt(byte[] toEncrypt) throws Exception {
String cipherStr;
String modStr ="AA878F0D9........";
String expStr = "10001";
BigInteger modulus = new BigInteger(modStr,16);
BigInteger exponent = new BigInteger(expStr,16);
System.out.println("modulus = "+modulus+"// exponent = "+exponent);
RSApubKey = new RSAKeyParameters(false,modulus,exponent);
if (RSApubKey == null)
throw new Exception("Generate RSA keys first!");
AsymmetricBlockCipher eng = new RSAEngine();
eng = new PKCS1Encoding(eng);
eng.init(true, RSApubKey);
byte[] cipherByte = eng.processBlock(toEncrypt, 0, toEncrypt.length);
return cipherByte;//cipherStr;
}
public String RSADecrypt (byte[] toDecrypt) throws Exception {
System.out.println("toDecrypt = "+toDecrypt);
//byte[] toDecByte = toDecrypt.getBytes("UTF-8");
//System.out.println("toDecByte ="+toDecByte);
String plainText;
BigInteger RSAmod = new BigInteger("00d1aec38b8d189a0a1..",16);
BigInteger RSAprivExp = new BigInteger("2d7af1b1283688dadc16..",16);
BigInteger RSApubExp = new BigInteger("10001",16);
BigInteger RSAdp = new BigInteger("00f5847cc67ea018f10f16..",16);
BigInteger RSAdq = new BigInteger("00daa299bf356c6c6db6a21..",16);
BigInteger RSAp = new BigInteger("00e28dd601e878dd6b1c0c..",16);
BigInteger RSAq = new BigInteger("400ff2e2df018507e4c2be6..",16);
BigInteger RSAqInv = new BigInteger("00cf4b2ba101efb2378aee..",16);
RSAPrivateCrtKeyParameters RSAprivKey = new RSAPrivateCrtKeyParameters(RSAmod, RSApubExp,
RSAprivExp, RSAp, RSAq, RSAdp, RSAdq, RSAqInv);
AsymmetricBlockCipher eng = new RSAEngine();
eng = new PKCS1Encoding(eng);
eng.init(false, RSAprivKey);
byte[] plainByte = eng.processBlock(toDecrypt, 0, toDecrypt.length);
plainText = new String(plainByte);
return plainText;
}
public 密钥和私钥之间的模数不匹配。它应该匹配。私钥模数可能更小(假设大端表示法和相同长度的十六进制字符串),这就是您收到此错误消息的原因。由于私钥包含模数和public指数部分,您可以在加密代码中替换它们,看看解密是否可以使用新的密文。
RSA 的工作原理是将一些消息提升为 e(public 指数)模 m 的幂。这导致密文小于 m,但接近它。解密的工作原理是将密文提高到 d(私有指数)模 m(相同模数)的幂。
如果私钥模数远小于public密钥模数,则密文会更大,无法解密。从数学上讲,可以 "decrypt" 密文,但您不会得到原始明文。图书馆可能会就此警告您。