安卓上一个奇怪的 rsa,每次加密结果都一样

2020-01-09 00:00:11 +08:00
 szvone

排版乱了,请看一楼

5744 次点击
所在节点    问与答
38 条回复
szvone
2020-01-09 00:00:54 +08:00
有这么一个函数:

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/PTNev\n" +
"uDjQQvI8pjooKreTab2sbSUuv2otPxfLC+IyN58ye7UCAwEAAQ==";

String res = null;

try {

res = a("13888888888",key);

} catch (Exception e) {

e.printStackTrace();

}


得到的 res 始终会是:LTaf1+LNtbI0NHMISTHuiY10rYKQK0BhqkgHqcrM1N8nYWZXUR0WuKMvU4ZzCZD1D0hdO9ZhcXuM1NdL0mOSyg==


且这个 res 永远都是这个值,RSA 加密的话不是每次都会变动吗,为啥这个就不会变动呢?

这个用 javascript 怎么实现呢?
momocraft
2020-01-09 00:14:49 +08:00
为什么你会期待变动啊
CEBBCAT
2020-01-09 00:57:59 +08:00
可能是你选的版本的事儿。发代码可以用 gist

麻烦您发帖前不要忘记先 Google,我一搜就有 https://blog.csdn.net/guyongqiangx/article/details/74930951
bkmi
2020-01-09 01:02:52 +08:00
因为你 Cipher.getInstance() 传错参数了,看一下文档。
szvone
2020-01-09 01:26:11 +08:00
@CEBBCAT 大佬,我问的是为啥不会变动
szvone
2020-01-09 01:26:53 +08:00
@momocraft 因为 rsa 是非对称加密 每次的加密结果不是应该要变动才对吗
szvone
2020-01-09 01:27:52 +08:00
@bkmi 有个问题就是如果不用安卓的话,用 Java 跑,他会变动
CEBBCAT
2020-01-09 01:30:50 +08:00
@szvone 大哥,我给你提供了两个信息:

1. Google 就有
2. 有人详细调查了为什么他那边回回不同

拿出你的主观能动性来啊!
CEBBCAT
2020-01-09 01:32:00 +08:00
@szvone 我吊,谁说非对称就要回回不一样了?
webshe11
2020-01-09 01:39:42 +08:00
把 a() 改成 random() 保证回回都不一样(滑稽
crab
2020-01-09 01:40:34 +08:00
填充用的全 0 或者 F 不是随机数吧
yicong135
2020-01-09 01:51:52 +08:00
👏
nvkou
2020-01-09 02:00:23 +08:00
输入不变输出还变?还是不是一一映射了?非对称是不能推导出私钥而保证加密方安全。
xiri
2020-01-09 04:17:28 +08:00
你对非对称加密貌似有什么误解
geelaw
2020-01-09 04:42:59 +08:00
@momocraft #2
@CEBBCAT #9
@nvkou #13
@xiri #14

一个定理:一个具有最基本安全性(具体来说是语义安全)的非对称加密算法必须满足,正常生成的密钥,加密同一消息两次,密文相同的概率必须非常小。

回到题主的问题,我个人并不是很懂 Java 的 API,根据文档字符串是 RSA 的时候使用 PKCS#1 定义的 RSA 变换,我个人也不是很懂 PKCS#1,一个可能的理解是 Android 上该算法的实现是 RSA 陷门函数,并不是一个安全的加密算法。
isnullstring
2020-01-09 08:28:39 +08:00
私钥 解密
公钥 加密
那你的公钥变了没?
mxT52CRuqR6o5
2020-01-09 08:30:08 +08:00
@geelaw 是密码体制而不是非对称加密算法吧
geelaw
2020-01-09 08:41:08 +08:00
@mxT52CRuqR6o5 #17 和非对称密码学紧密相关的算法可以总称为“非对称密码(学)算法”,而“非对称加密算法”是指非对称加密方案 (public-key encryption scheme) 的加密算法 (encryption algorithm)。
baicheng10
2020-01-09 08:43:15 +08:00
@geelaw #14 正常生成的密钥,加密同一消息两次,密文相同的概率必须非常小 ---> 相同的密钥,加密同一消息数次,密文各不相? 你这是“量子加密”么 ……
ThirdFlame
2020-01-09 08:50:32 +08:00
非对称加密 没有说在明文 和 秘钥不改变的情况下,密文会变的说法。

但是有些加密函数自带了填充,比如 最优非对称加密填充(OAEP),那么每次加密时会对明文进行了填充(每次填充都不一样),就导致了密文每次都会发生变化。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/636314

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX