我正在尝试使用静态密钥进行编码,例如:"" B3FFCA612CD0C3D9050A4DE3588E2830F26BEF6D7E1CEC77DD2F22FAFC038D33"在AES和ECB模式下。当我用openssl尝试这个时,我成功地得到了一个没有问题的结果,但当我在groovy或java中编码时:
无效的AES密钥长度:64字节
当我研究这个时,出现问题是因为密钥长度最多可以是32个字节,现在我很困惑,因为我发送这些加密的API,完全适用于我发送的64字节密钥但是失败了32字节一个。 openssl使用我提供的64字节密钥对此进行编码,如下所示:
openssl enc -aes-256-ecb -e -in infile.txt -a -A -K B3FFCA612CD0C3D9050A4DE3588E2830F26BEF6D7E1CEC77DD2F22FAFC038D33 -iv 0 -p
我希望能够在groovy / java中做同样的事情。
我不确定我错过了什么,我真的会请你帮忙!
这是我的代码:
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.SecretKeyFactory;
import javax.crypto.SecretKey;
import javax.crypto.Cipher;
import java.security.spec.KeySpec;
import javax.crypto.spec.PBEKeySpec;
class AESCrypt {
// encrypt
def encrypt (def plainText, def secret) {
def cipher = Cipher.getInstance("AES/ECB/PKCS5Padding")
// converty string secret to SecretKeySpec
byte[] decodedKey = Base64.getDecoder().decode(secret);
SecretKeySpec key= new SecretKeySpec(decodedKey , 0, decodedKey.length,
"AES");
cipher.init(Cipher.ENCRYPT_MODE, key)
return cipher.doFinal(plainText.getBytes("UTF-8")).encodeBase64().toString()
}
}
//Main
for( int i = 0; i < dataContext.getDataCount(); i++ ) {
InputStream is = dataContext.getStream(i);
Properties props = dataContext.getProperties(i);
def c = new AESCrypt()
def secret =
"B3FFCA612CD0C3D9050A4DE3588E2830F26BEF6D7E1CEC77DD2F22FAFC038D33"
//get plaintext of payload
Scanner s = new Scanner(is).useDelimiter("\\A");
String plainPayload = s.hasNext() ? s.next() : "";
//encrypt plaintext of payload
def encryptedPayload = c.encrypt(plainPayload, secret)
println encryptedPayload + "\n"
}
答案 0 :(得分:3)
openssl使用我提供的64字节密钥对此进行编码,如下所示。
它不是64字节密钥。它是一个32字节的密钥,经过hexadecimal编码,产生64个字母。
您正在尝试对您的密码进行base64解码,这与十六进制不同。
我不是Java或Groovy专家,但可以在您的字符串上使用decodeHex()
对其进行十六进制解码而不是base64解码。