安卓上一个奇怪的 rsa,每次加密结果都一样
排版乱了,请看一
排版乱了,请看一
public static String a(String str, String str2) throws Exception {
Cipher v1 = Cipher.getInstance(“RSA”);
v1.init(1, KeyFactory.getInstance(“RSA”).generatePublic(new X509EncodedKeySpec(Base64.decode(str2,Base64.DEFAULT))));
return Base64.encodeToString(v1.doFinal(str.getBytes()),Base64.DEFAULT);
}
用下面的代码调用:
String key = “MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAI6Nnwc6Doyk6sFvN/oVbsjS+EhV661qfVrgfJ/PTNevn” +
“uDjQQvI8pjooKreTab2sbSUuv2otPxfLC+IyN58ye7UCAwEAAQ==”;
String res = null;
try {
res = a(“13888888888”,key);
} catch (Exception e) {
e.printStackTrace();
}
得到的 res 始终会是:LTaf1+LNtbI0NHMISTHuiY10rYKQK0BhqkgHqcrM1N8nYWZXUR0WuKMvU4ZzCZD1D0hdO9ZhcXuM1NdL0mOSyg==
且这个 res 永远都是这个值,RSA 加密的话不是每次都会变动吗,为啥这个就不会变动呢?
这个用 javascript 怎么实现呢?
麻烦您发帖前不要忘记先 Google,我一搜就有 https://blog.csdn.net/guyongqiangx/article/details/74930951
1. Google 就有
2. 有人详细调查了为什么他那边回回不同
拿出你的主观能动性来啊!
一个定理:一个具有最基本安全性(具体来说是语义安全)的非对称加密算法必须满足,正常生成的密钥,加密同一消息两次,密文相同的概率必须非常小。
回到题主的问题,我个人并不是很懂 Java 的 API,根据文档字符串是 RSA 的时候使用 PKCS#1 定义的 RSA 变换,我个人也不是很懂 PKCS#1,一个可能的理解是 Android 上该算法的实现是 RSA 陷门函数,并不是一个安全的加密算法。
你这是“量子加密”么
…… 但是有些加密函数自带了填充,比如 最优非对称加密填充(OAEP),那么每次加密时会对明文进行了填充(每次填充都不一样),就导致了密文每次都会发生变化。
上面 geelaw 已经指出来了,还一堆人在那不懂装懂。另外,geelaw 你最后“可能的理解”是错的,Android 上的 API 是正确的,只是有些人不会用又不愿意读文档而已。
@baicheng10 #19 如果你加密同一条消息多项式次,密文以极高的概率各不相同。
@ThirdFlame #20 确定性加密并不安全。
@mxT52CRuqR6o5 #24 你可以参考 #23 的链接。
你的问题 其实就是要去看 那个函数实现里面有没有填充。 而不是问 “RSA 加密的话不是每次都会变动吗,为啥这个就不会变动呢?”
另外,那个问题不是“我的问题”。
@xiri #29
之前我一直是说结论,懒得提症结,觉得还是需要点明一下:很多回复混淆了 RSA 陷门函数和(安全的) RSA 加密。
感谢各位大佬的回复,我遇到的问题是,如果在电脑上面跑 main 函数,那么这个加密结果是会变动,如果在安卓上用按钮事件触发,这个加密结果始终不变,在无法改动安卓代码的情况下,服务端应该如何编写这个加密过程
@szvone #32 你在 Android 上面调用 init 方式没有指定 iv,这是为啥每次结果都一样的原因。安全的做法是像下面这样调用
cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(ivBytes));
@geelaw #27 Android 和 Java 上面实现不同,Android 默认没有用随机 iv 填充。这是实现的差异,两者都是符合规范的。spec 里原文是
If this cipher requires any algorithm parameters that cannot be derived from the given key, the underlying cipher implementation is supposed to generate the required parameters itself (using provider-specific default or random values)
参考: https://stackoverflow.com/questions/31036780/android-cryptography-api-not-generating-safe-iv-for-aes#31037133