2013-01-12 44 views
-1

我是新來的安全人員,並且我嘗試了很多以移除異常(在代碼下面)。 RC2和RC6密碼都給出了這個例外。輸入應爲128位String,密鑰爲128位,輸出應爲128位密文。java.security.InvalidAlgorithmParameterException:在RC6以及RC2中

import java.security.spec.AlgorithmParameterSpec; 
import javax.crypto.Cipher; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.SecretKeySpec; 
import java.util.*; 

public class RC2Encrypt 
{ 
    public static void main(String args []) throws Exception 
    { 
     Scanner s=new Scanner(System.in); 
     System.out.println("Enter PlainTextString:"); 
     String input=s.nextLine(); 

     System.out.println(); 
     System.out.println("Enter 16 digit key:"); 
     String strPassword=s.nextLine(); 

     SecretKeySpec key = new SecretKeySpec(strPassword.getBytes(), "RC2"); 
     AlgorithmParameterSpec paramSpec = new IvParameterSpec(strPassword.getBytes()); 
     Cipher cipher = Cipher.getInstance("RC2"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); 

     byte[] encrypted = cipher.doFinal(input.getBytes()); 

     String b1 = new String(encrypted); 
     System.out.println("Original string: " + input); 
     System.out.println("Encrypted string: " + b1); 
    } 
} 

,這將產生以下異常:

Exception in thread "main" java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 8 bytes long 
    at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..) 
    at com.sun.crypto.provider.RC2Cipher.engineInit(DashoA13*..) 
    at javax.crypto.Cipher.a(DashoA13*..) 
    at javax.crypto.Cipher.a(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at RC2Encrypt.main(RC2Encrypt.java:40) 
+0

我試圖改變參數,我也使用keyGenerator但也有同樣的錯誤,在執行過程中,我看到這個異常 – user1972920

+0

你沒有向我們展示異常。除非你這樣做,否則不應該試圖回答這個問題。 –

+0

線程「main」中的@GregS異常java.security.InvalidAlgorithmParameterException:錯誤的IV長度:必須是8字節長在com.sun.crypto.provider.SunJCE_f.a(DashoA13 * ..) 必須是8字節com.sun.crypto .provider.RC2Cipher.engineInit(DashoA13 * ..) at javax.crypto.Cipher.a(DashoA13 * ..) at javax.crypto.Cipher.a(DashoA13 * ..) at javax.crypto.Cipher。 init(DashoA13 * ..) at javax.crypto.Cipher.init(DashoA13 * ..) at RC2Encrypt.main(RC2Encrypt.java:40) – user1972920

回答

0

您的代碼存在多個問題。

最重要的是你混淆了字符和字節。您將必須知道關於 - 這是關於編碼二進制和後面的文本 - 和 - 這是關於編碼二進制作爲可讀文本。

如果您期望8個字節由16個字符編碼,那麼這意味着您需要執行十六進制解碼(每個字節使用兩個字符)。這樣做的最好方法是使用Apache通用編解碼器庫或Bouncy Castle庫。我會建議後者,因爲它包含更多的加密算法 - 包括RC6。最好的方法是將Bouncy Castle提供者用於加密功能。

好吧,這樣就解決了與鍵和IV部分,現在爲純文本。純文本必須是二進制編碼的。不幸的是,你現在正在使用平臺的默認字符集。這意味着如果您想與其他系統(或其他應用程序,即使在您自己的PC上,如果使用其他字符集)交換它,也會遇到兼容性問題。要解決這個問題,你應該自己指定一個編碼,例如使用String.getBytes(Charset.forName("UTF-8"))或Java 7以上String.getBytes(StandardCharsets.UTF_8)。對構造函數做同樣的事情。

此外,你真的不應該使用密鑰和IV相同的字節。 IV用於使用相同的密鑰加密多個密文,而不會引入安全漏洞。例如。攻擊者可能知道第一個不是那麼祕密的密文包含單詞「是」。然後下一個密碼塊出現幷包含完全相同的字節;顯然發件人已經發送了「是」一詞。如果IV發生了變化,攻擊者將看到完全不同的密文 - 儘管流密碼的長度仍然是3字節。

最後,密鑰和IV應該是隨機生成的 - 可能在過去的某個時間。如果需要密碼而不是密鑰,則應使用PBKDF(基於密碼的密鑰衍生功能)作爲次優替代。但我認爲這可能是一個更高級的話題。

+0

OP代碼中的_real_錯誤在Cipher.getInstance(」RC2「);'中,所以甚至沒有涉及到字符編碼(儘管,當然,如果密碼被初始化,編碼會出現問題)。一團糟。 – praseodym

+0

@praseodym不,這是不正確的,'Cipher.getInstance(「RC2」)'明智的編程沒有錯誤。它不產生任何例外的事實應該表明事實是真實的。 –

1

,我一定會推薦不同的算法,因爲RC2是非常弱的。據我所知,JRE沒有捆綁RC6的支持。

你可以使用TDES如下:

SecretKeySpec key = new SecretKeySpec(keyBytes, "DESede"); 
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding"); 
cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 
byte[] encrypted = cipher.doFinal(input.getBytes()); 

注意,你需要指定一個initialisation vector是由隨機字節,當然你(在你的代碼等)的關鍵。此外,TDES需要128位或192位密鑰。

+0

thanx幫助,但我必須顯示由AES,DES,3DES,blowfish,RC2和RC6生成的密碼這就是yim要求RC6 – user1972920

+0

上面這個代碼爲3DES也是同樣的例外。線程「main」中的異常java.security.InvalidAlgorithmParameterException:錯誤的IV長度:必須是8字節長的com.un.crypto.provider.SunJCE_f.a(DashoA13 * ..) 在com.sun.crypto.provider。 DESedeCipher.engineInit(DashoA13 * ..) at javax.crypto.Cipher.a(DashoA13 * ..) at javax.crypto.Cipher.a(DashoA13 * ..) at javax.crypto.Cipher.init(DashoA13 (TripleDESTestEncrypt.java:50) – user1972920

+0

@owlstead在我的答案後添加了OP中的堆棧跟蹤; user1972920像我的答案,說你需要一個IV;上面評論中的堆棧跟蹤清楚地表明你的IV的長度錯誤。 – praseodym