
1 wo642436249 OP 代码如下: 加密: 参数是密码 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; } 加密时没有报错,解密时一直报错,不晓得如何修改,望大佬指点。 |
2 lhx2008 May 5, 2019 via Android java 的加密解密挺麻烦,有个轮子是 jasypt |
3 wo642436249 OP @lhx2008 好的,我先了解一下这个轮子。说到 java 加密解密麻烦,我刚上手 spring boot 的时候感觉 Java 写一般的 web 项目的时候有的地方感觉比 php 还简单,但是做到这个加解密的时候发现是真费劲 |
4 lhx2008 May 5, 2019 via Android @wo642436249 是的,而且你用 java 自带的是非线程安全的,jasypt 可以和 springboot 整合 |
5 vance May 5, 2019 导入的包是什么,我运行下 |
6 wolfie May 5, 2019 `new SecureRandom(AdminOpensslKey.getBytes())` 加密、解密时候产生的是一个值吗。 |
7 Cyron May 5, 2019 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); |
8 skypyb May 5, 2019 via Android 我之前写着玩的一小工具,里面有我封装的加密 /签名组件。有 aes 的。 你看看用的上不。 https://github.com/skypyb/JwtBuilder-CryptographicComponent |
9 Citrus May 5, 2019 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 就能解密成功? |
10 scoful May 5, 2019 是不是 java 安全那个证书的问题,google 一下 |
11 jinue9900 May 5, 2019 你的是 jdk1.8_162 以上的版本嘛 这个版本除去了加密的一些限制 |
12 wo642436249 OP @skypyb 有 AES-256-ECB 这个加解密的方法嘛? |
13 HangoX May 5, 2019 https://github.com/google/tink 谷歌为了防止大家把加密解密写错,专门出了一个多语言平台的库 |
14 xiangyuecn May 5, 2019 i...i...iv 简单点的:保证对同一内容的加密 每次返回结果都一样,再来谈只用一个参数(密码)来解密。问题解决。 |
15 qwerthhusn May 5, 2019 ``` 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 加出来的结果是一样的 |
17 WordTian May 5, 2019 via Android |
18 tcitry May 5, 2019 |
19 wo642436249 OP @vance 照着代码敲,idea 编辑器自动加载了,哈哈 |
20 gaius May 5, 2019 加密解密的 key 要一样,如果有 iv iv 也要一样... 如果是 jdk7 提示 key 长度不合法还要去 Oracle 下载 2 个 jar |
21 wo642436249 OP @gaius 用的是 8 版本的 |