我正在尝试对Flash应用程序进行逆向工程以应对挑战和知识。
我必须将RSA编码的BigInteger发送给客户端,客户端将在使用前对其进行验证。
我的问题是,当客户端解压BigInteger时,出现以下错误消息:
PKCS#1 unpad: i=1, expected b[i]==[0,1,2], got b[i]=xx
(其中 xx 是一个十六进制数字)
这是我在Java服务器端所做的:
this.g = new BigInteger("hexString #1", 16);
this.n = new BigInteger("hexString #2", 16);
this.privateKey = generateRandomBI();
this.secretKey = this.g.modPow(this.privateKey, this.n);
KeyFactory factory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(
new BigInteger("hexString #3", 16),
BigInteger.valueOf(65537)
);
RSAPublicKey publicKey = (RSAPublicKey) factory.generatePublic(publicKeySpec);
SecretKey secretKeySpec = new SecretKeySpec(this.secretKey.toByteArray(), "RSA");
Cipher rsa = Cipher.getInstance("RSA/ECB/PKCS1Padding");
rsa.init(Cipher.WRAP_MODE, publicKey);
byte[] encryptedSecretKey = rsa.wrap(secretKeySpec);
然后我将 encryptedSecretKey 发送给客户端,客户端会收到上述错误。
这是客户端:
var rsa:RSAKey = new RSAKey(
new BigInteger("hexString #3"),
65537
);
var decoded:ByteArray = new ByteArray();
rsa.verify(key, decoded, key.length);
键是我用Java发送的内容。
我无法修改客户端(AS3)端,并且我已经尝试使用所有其他 RSA / ECB / 算法,但是生成的密钥与它们不兼容。
如果需要,我可以发布更多的客户端和服务器代码。 我使用的 hexString (#1,#2和#3)来自AS3客户端。 AS3 RSAKey类来自as3-crypto。
请帮我提供一些线索吗? 非常感谢您,祝您愉快!
关于, s间