所以基本上我有这些代码片段,并希望它们产生相同的输出:
require 'openssl'
aes = OpenSSL::Cipher::Cipher.new("AES-128-CBC")
aes.key = "aaaaaaaaaaaaaaaa"
aes.iv = "aaaaaaaaaaaaaaaa"
aes.encrypt
encrypted = aes.update("1234567890123456") << aes.final
puts encrypted.unpack('H*').join
打印:
8d3bbffade308f8e4e80cb77ecb8df19ee933f75438cec1315c4a491bd1b83f4
这个Java代码:
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String key = "aaaaaaaaaaaaaaaa";
String textToEncryptpt = "1234567890123456";
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
IvParameterSpec ivspec = new IvParameterSpec(key.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(textToEncryptpt.getBytes());
System.out.println(Crypto.bytesToHex(encrypted));
打印:
2d3760f53b8b3dee722aed83224f418f9dd70e089ecfe9dc689147cfe0927ddb
令人讨厌的是,它在几天前工作......所以我不确定发生了什么。这段代码有什么问题?你看到什么异常吗?
答案 0 :(得分:1)
Ruby脚本错了。您必须先调用encrypt
方法,然后设置key
和iv
:
require 'openssl'
aes = OpenSSL::Cipher::Cipher.new("AES-128-CBC")
aes.encrypt
aes.key = "aaaaaaaaaaaaaaaa"
aes.iv = "aaaaaaaaaaaaaaaa"
encrypted = aes.update("1234567890123456") << aes.final
puts encrypted.unpack('H*').join
我想通了,因为在尝试解码加密的字符串时我得到了:
aescrypt.rb:13:in `final': bad decrypt (OpenSSL::Cipher::CipherError)
from aescrypt.rb:13:in `<main>'
答案 1 :(得分:0)
似乎你发现你的脚本确实给出了不同的结果。
还有一些事情需要考虑:
String.getBytes()
(在Java中)使用某种编码将字符串转换为字节。使用的编码是系统相关的,并且通常的字符串编码(UTF-8,Latin-1,...)都不能将所有字节表示为可打印(和可键入)字符。如果必须将密钥存储为字符串,最好使用Base64或hex-encoding之类的东西。答案 2 :(得分:0)
@Cristian,对于键和初始向量,您可以使用今天的日期加上安全的固定关键字来创建一个函数。
例如:key = 2012年1月8日+密钥
对于初始向量,
例如:iv = 2012年1月8日+ IV
然后将该数据(键和iv)输入到MD5,它将产生输出16个字节,您可以将其用于Key和IV。每天,钥匙和静脉注射会随机变化。
确保两个系统在同一日期使用相同的日期格式和设置。