2014-07-23 244 views
-1

我想用AES256加密text,我想用我的電子郵件[email protected]作爲加密它。AES-256加密:從我的固定字符串生成256位(32字節)密鑰

這是我的嘗試:

String key = "[email protected]"; 
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 

byte iv[] = SOME_RANDOM_32_BYTES; 
IvParameterSpec ivSpec = new IvParameterSpec(iv); 

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec); 

byte[] encryptedResult = cipher.doFinal(text.getBytes("UTF-8")); 

當我運行上面的代碼中,我得到了InvalidKeyException將

java.security.InvalidKeyException: Key length not 128/192/256 bits. 

我網上查了,原因是我的鑰匙是不是128/192/256位。我的問題是,如何從電子郵件字符串[email protected]生成256位(32字節)密鑰?

+1

[Java 256-bit AES Password-Based Encryption](http://stackoverflow.com/questions/992019/java-256-bit-aes-password-based-encryption) –

+0

@ KonstantinV.Salikhov,我檢查了你提供的鏈接,他問了如何使用他的密碼來生成密鑰,但在接受的解決方案中,我沒有看到他的密碼在哪裏使用? – user842225

+1

@ user842225關於鏈接,假定存在局部變量'password'。它用在這行中:'KeySpec spec = new PBEKeySpec(password,salt,65536,256);'。當然,可能的複製假設密碼是祕密的 - 在你的情況下它不會。 –

回答

2

您可以使用SHA256將您的密鑰字符串([email protected])散列爲256位值。

MessageDigest md = MessageDigest.getInstance("SHA-256"); 
md.update(yourEmail.getBytes()); 
byte[] encryptionKey = ms.digest(); 
2

那麼,明顯的建議是墊key.getBytes("UTF-8")與某些(非隨機的)值32個字節。或者爲您的密碼生成一個256位加密哈希...

但請注意,從這樣的密碼生成的密鑰可能很弱,並且可能容易受到「密碼猜測」或「彩虹表」攻擊。一個正確生成的隨機密鑰會更強大得多。


實際上,如何將密碼變爲密鑰並不重要。如果「壞人」知道你使用什麼算法,他們可以通過猜測密碼來試圖強制你的密鑰。

對密碼進行醃製可能會使「彩虹桌」攻擊無效,但您仍然需要將鹽...放在加密文件的信封中。

相關問題