1。JAVA关于AES的代码很多,但是找到能跟OpenSSL配对的很少。
这是加密的程序,解密程序也差不多
SecretKeySpec secretKeySpec = new SecretKeySpec(password, "AES");
IvParameterSpec paramSpec = new IvParameterSpec(ivi);
Cipher ecipher = Cipher.getInstance("AES/CBC/NOPADDING");
ecipher.init(Cipher.ENCRYPT_MODE, secretKeySpec,paramSpec);
问题
1.网上很多JAVA AES算法,很多都用SecureRandom,如果你的代码中出现了SecureRandom这个东西,那么恭喜你,
你再也不能用C解出来了。
2.跟C约定相同的AES算法,AES实现有四种,像CBC/ECB/CFB/OFB
3.约定相同的Padding
java支持的Padding方式有三种NoPadding/PKCS5Padding/
每种的补齐方式是不一样的,这跟OpenSSL是有区别的,OpenSSL中补齐的方式是/0,但是JAVA中没有这一种方式。
所以方便起见,就跟C约定好补齐
附其它资料:
http://blog.turbidsoul.me/posts/opensslhe-java-aessuan-fa-de-de-wen-ti.html
——————————————————————————————————————————-
还有一个问题,不通操作系统JAVA生成的密钥不一样。
原因分析
SecureRandom 实现完全随操作系统本身的內部状态,除非调用方在调用 getInstance 方法之后又调用了 setSeed 方法;该实现在 windows 上每次生成的 key 都相同,但是在 solaris 或部分 linux 系统上则不同。
______________________________________________
另外还有人说一个问题:
kgen.init(128, new SecureRandom(password.getBytes()));这样产生的key不是固定的,解密的时候会有问题的。
————————————————————————————————
楼主,你确定你的AES加密的可以用???
kgen.init(128, new SecureRandom(password.getBytes()));
我可是被你坑惨了 啊!!!!
你用你的加密算法加密一段字符,一周以后,你再用你的解密方法,看看能否解密!!!!!!
等你回答!!!!!
————————————————————————————————————
总之你去用阿帕奇的工具类吧,你也可以用这个例子验证一下,照我评论里说的,加密一段字符串,等一周以后再用楼主的文章里面的方法解密,你看看你能不能解密了。
——————————————————————————————————————
听说还可以用 OpenSSL AES 实现加密解密,供C++使用
评论