初来乍到,问一个 Java 的 AES-256-ECB 加密解密问题

2019-05-05 08:37:55 +08:00
 wo642436249
最近要求从 php 转 java,快速又低质量的撸了一遍菜鸟教程 java 教程后,立刻投入 spring boot 的怀抱,然后做其中一个模块时用到了 AES-256-ECB 加密解密。
5200 次点击
所在节点    Java
21 条回复
wo642436249
2019-05-05 08:40:51 +08:00
代码如下:
加密: 参数是密码
public static String AdminPasswordEncrypt(String password) throws Exception { //AES-256-ECB
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
byte[] encrypted = cipher.doFinal(password.getBytes("utf-8"));
return new Base64().encodeToString(encrypted);
}

解密:参数是加密后的密码
public static String AdminPasswordDecrypt(String enPassword) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] encrypted1 = new Base64().decode(enPassword);
byte[] original = cipher.doFinal(encrypted1);
String originalString = new String(original, "utf-8");
return originalString;
}


加密时没有报错,解密时一直报错,不晓得如何修改,望大佬指点。
lhx2008
2019-05-05 08:41:30 +08:00
java 的加密解密挺麻烦,有个轮子是 jasypt
wo642436249
2019-05-05 08:43:51 +08:00
@lhx2008 好的,我先了解一下这个轮子。说到 java 加密解密麻烦,我刚上手 spring boot 的时候感觉 Java 写一般的 web 项目的时候有的地方感觉比 php 还简单,但是做到这个加解密的时候发现是真费劲
lhx2008
2019-05-05 08:50:58 +08:00
@wo642436249 是的,而且你用 java 自带的是非线程安全的,jasypt 可以和 springboot 整合
vance
2019-05-05 09:04:10 +08:00
导入的包是什么,我运行下
wolfie
2019-05-05 09:12:00 +08:00
`new SecureRandom(AdminOpensslKey.getBytes())`
加密、解密时候产生的是一个值吗。
Cyron
2019-05-05 09:13:06 +08:00
KeyGenerator kgen = KeyGenerator.getInstance("AES");

SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(secureKey.getBytes());
kgen.init(128, secureRandom);

SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");

Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] byteContent = content.getBytes("utf-8");
byte[] result = cipher.doFinal(byteContent);

return encodeBASE64(result);
skypyb
2019-05-05 09:38:06 +08:00
我之前写着玩的一小工具,里面有我封装的加密 /签名组件。有 aes 的。 你看看用的上不。
https://github.com/skypyb/JwtBuilder-CryptographicComponent
Citrus
2019-05-05 09:55:10 +08:00
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes()));
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES");

你每次加解密随机生成一个 Key,怎么玩?这是在学习猴子排序法么。。。随机到正确的 Key 就能解密成功?
scoful
2019-05-05 09:55:51 +08:00
是不是 java 安全那个证书的问题,google 一下
jinue9900
2019-05-05 10:19:05 +08:00
你的是 jdk1.8_162 以上的版本嘛 这个版本除去了加密的一些限制
wo642436249
2019-05-05 10:35:55 +08:00
@skypyb 有 AES-256-ECB 这个加解密的方法嘛?
HangoX
2019-05-05 10:37:17 +08:00
https://github.com/google/tink 谷歌为了防止大家把加密解密写错,专门出了一个多语言平台的库
xiangyuecn
2019-05-05 10:45:26 +08:00
i...i...iv

简单点的:保证对同一内容的加密 每次返回结果都一样,再来谈只用一个参数(密码)来解密。问题解决。
qwerthhusn
2019-05-05 10:51:37 +08:00
```
public static void main(String[] args) throws Exception {
// openssl enc -e -nosalt -aes-128-ecb -p -K 71776572747975696f70617364666768 -in 1.txt -out 1.enc
// base64 1.enc
byte[] keyPlain = "qwertyuiopasdfgh".getBytes(Charsets.ISO_8859_1);
System.out.println("key = " + Hex.encodeHexString(keyPlain));
SecretKeySpec key = new SecretKeySpec(keyPlain, "AES");

byte[] plain = "ABCDEF\n".getBytes(Charsets.ISO_8859_1);
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encrypted = cipher.doFinal(plain);
System.out.println(Base64.encodeBase64String(encrypted));
}
```

用 Java 的用 OpenSSL 加出来的结果是一样的
CRVV
2019-05-05 10:58:21 +08:00
@HangoX
这种库通常不会有 ECB 的,因为用 ECB 就已经写错了
类似这种的还有 libsodium
WordTian
2019-05-05 10:59:04 +08:00
emmm
从 1 楼看,参数是要加密的内容好吗? key 是你用 kgen.generateKey()随机生成的啊
就像 9# @Citrus 说的,你要能成功加解密就怪了
tcitry
2019-05-05 11:00:35 +08:00
wo642436249
2019-05-05 11:18:38 +08:00
@vance 照着代码敲,idea 编辑器自动加载了,哈哈
gaius
2019-05-05 11:42:01 +08:00
加密解密的 key 要一样,如果有 iv iv 也要一样... 如果是 jdk7 提示 key 长度不合法还要去 Oracle 下载 2 个 jar

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

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

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

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

© 2021 V2EX