我正在玩Android上的RSA,我意识到RSA加密会产生不同的密文,因为填充有明文和公钥相同,是否有办法在给定相同的明文和公钥的情况下生成相同的密文?
同样,给定相同的明文和私钥的运行之间的数字签名是否不同,是否有办法生成相同的数字签名?
这是我的keygen:
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.PrivateKeyEntry entry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(mAlias, null);
Cipher cip = null;
RSAPublicKey pubKey = (RSAPublicKey)entry.getCertificate().getPublicKey();
cip = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cip.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encryptBytes = cip.doFinal(challenge.getBytes());
以下是我加密的方式:
char x[] = "hello";
char *y = "world";
*y = x[1];
printf("%s", y);
感谢。
答案 0 :(得分:1)
要始终生成相同的密文,请使用不带填充的算法。将RSA/ECB/PKCS1Padding
替换为RSA/ECB/NoPadding
。
但是,出于安全原因,我建议使用带填充的算法,如果可能的话,使用OAEP RSA/ECB/OAEPWithSHA-1AndMGF1Padding
(可从Android 23获得)。填充不应该是解密端的问题
对于相同的私钥和要签名的数据,PCKS#1数字签名将产生相同的结果