2017-06-30 301 views
-1

我想使用靜態密鑰進行編碼,舉例來說:在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" 



} 
+2

另外,您正在使用ECB加密,這是一種非常糟糕的加密形式。至少請考慮使用CBC。 – vcsjones

+1

查找[DatatypeConverter](https://docs.oracle.com/javase/7/docs/api/javax/xml/bind/DatatypeConverter.html)類的靜態方法'parseHexBinary()'。 –

+0

@vcsjones感謝您的評論。不幸的是,我使用的API是一個需要這種加密的應用程序。我無法訪問該應用程序。 – Nat

回答

3

的OpenSSL與64個字節的密鑰我提供如下編碼這一點。

它不是一個64字節的密鑰。這是一個32位密鑰,編碼爲hexadecimal,結果爲64個字母。

您正在嘗試base64解碼您的密碼,該密碼與十六進制不相同。

我不是Java或Groovy專家,但可能能夠使用decodeHex()對您的字符串進行十六進制解碼,而不是對base64進行解碼。

+0

謝謝!我現在明白了,那是問題所在。 – Nat

相關問題