我想使用靜態密鑰進行編碼,舉例來說:在AES和ECB模式下的「B3FFCA612CD0C3D9050A4DE3588E2830F26BEF6D7E1CEC77DD2F22FAFC038D33」。當我嘗試這與OpenSSL的,我順利拿到,沒有問題的結果,但是當我在Groovy或Java代碼是:無效的AES密鑰長度:64字節
無效的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的。
我不確定我錯過了什麼,我真的會在這個apprecaite你的幫助!
這裏是我的代碼:
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"
}
另外,您正在使用ECB加密,這是一種非常糟糕的加密形式。至少請考慮使用CBC。 – vcsjones
查找[DatatypeConverter](https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html)類的靜態方法'parseHexBinary()'。 –
@vcsjones感謝您的評論。不幸的是,我使用的API是一個需要這種加密的應用程序。我無法訪問該應用程序。 – Nat