AES密钥长度无效:64字节

时间:2017-06-30 20:28:21

标签: java encryption groovy openssl aes

我正在尝试使用静态密钥进行编码,例如:"" 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"



}

1 个答案:

答案 0 :(得分:3)

  

openssl使用我提供的64字节密钥对此进行编码,如下所示。

它不是64字节密钥。它是一个32字节的密钥,经过hexadecimal编码,产生64个字母。

您正在尝试对您的密码进行base64解码,这与十六进制不同。

我不是Java或Groovy专家,但可以在您的字符串上使用decodeHex()对其进行十六进制解码而不是base64解码。