3

我是Java新手,嘗試使用使用AES-128對稱加密的混合加密,然後使用RSA-1024對生成的對稱密鑰進行非對稱加密。有人可以幫助我爲什麼得到這個例外。我已經關注了其他文章,並在適當的文件夾中下載了Java加密擴展(JCE)無限強度管轄權策略文件版本6。java.security.InvalidKeyException:密鑰長度不是128/192/256位

Code snippet: 
import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.security.Key; 
import java.security.InvalidKeyException; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.Security; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.spec.SecretKeySpec; 
import java.security.SecureRandom; 

    public class MainClass { 

     /** 
     * @param args 
     * Encryption and Decryption with AES/ECB/PKCS7Padding and RSA/ECB/PKCS1Padding 
     */ 
     public static void main(String[] args) throws Exception { 
      // TODO Auto-generated method stub 
      Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
      System.out.println("Enter a Message to be encrypted!"); 
      // Read an input from console 
      InputStreamReader isr = new InputStreamReader(System.in); 
      BufferedReader br = new BufferedReader(isr); 
      String s = br.readLine(); 

      // Get the bytes of the input stream. Convert the input text 
      // to bytes. 
      byte[] input = s.getBytes("UTF8"); 

      System.out.println("Input Message : " + new String(input)); 

      // AES 128 bits Symmetric encryption of data 

      // Generate the AES key for Symmetric AES encryption 
      KeyGenerator kgenerator = KeyGenerator.getInstance("AES", "BC"); 
      SecureRandom random = new SecureRandom(); 
      kgenerator.init(128, random); 

      Key aeskey = kgenerator.generateKey(); 
      byte[] raw = aeskey.getEncoded(); 
      int sykLength = raw.toString().length(); 
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 

      System.out.println("Generated Symmetric Key :" + raw); 
      System.out.println("Generated Symmetric Key Length :" + sykLength); 
      System.out.println("Generated Key Length in Bytes: " + raw.length); 

      // Encrypt the data using AES cipher 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); 
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec);   
      byte[] cipherText = new byte[cipher.getOutputSize(input.length)]; 
      int ctLength = cipher.update(input, 0, input.length, cipherText, 0); 
      ctLength += cipher.doFinal(cipherText, ctLength); 

      System.out.println("Encrypted Message :" + new String(cipherText)); 
      System.out.println("Encrypted Message Length: " + ctLength); 

      // RSA 1024 bits Asymmetric encryption of Symmetric AES key 

      // Generate Public and Private Keys (Can also use a certificate for keys) 
      KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC"); 
      kpg.initialize(1024, random); 
      KeyPair kpa = kpg.genKeyPair(); 
      RSAPublicKey pubKey = (RSAPublicKey) kpa.getPublic(); 
      RSAPrivateKey privKey = (RSAPrivateKey)kpa.getPrivate();  

      // Encrypt the generated Symmetric AES Key using RSA cipher 
      Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");    
      rsaCipher.init(Cipher.ENCRYPT_MODE, pubKey);    
      byte[] rawRSA = raw.toString().getBytes("UTF8"); 
      byte[] cipherTextRSA = new byte[rsaCipher.getOutputSize(rawRSA.length)]; 
      int ctLengthRSA = rsaCipher.update(rawRSA, 0, rawRSA.length, cipherTextRSA, 0); 
      ctLengthRSA += rsaCipher.doFinal(cipherTextRSA, ctLengthRSA); 

      System.out.println("Encrypted Symmetric Key :" + cipherTextRSA); 
      System.out.println("Encrypted Symmetric Key Length :" + ctLengthRSA); 
      System.out.println("Encrypted Symmetric Key Length in Bytes: " + cipherTextRSA.length); 

      // RSA Decryption of Encrypted Symmetric AES key 
      rsaCipher.init(Cipher.DECRYPT_MODE, privKey); 
      byte[] plainTextRSA = new byte[rsaCipher.getOutputSize(ctLengthRSA)]; 
      int ptLengthRSA = rsaCipher.update(cipherTextRSA, 0, ctLengthRSA, plainTextRSA, 0); 
      ptLengthRSA += rsaCipher.doFinal(plainTextRSA, ptLengthRSA); 
      SecretKeySpec DecrypskeySpec = new SecretKeySpec(plainTextRSA, "AES"); 

      System.out.println("Decrypted Symmetric Key: " + new String(plainTextRSA)); 
      System.out.println("Decrypted Symmetric Key Length: " + ptLengthRSA);  
      System.out.println("Decrypted Symmetric Key Length in Bytes: " + plainTextRSA.length); 

       cipher.init(Cipher.DECRYPT_MODE, DecrypskeySpec, cipher.getParameters()); 
       byte[] plainText = new byte[cipher.getOutputSize(ctLength)]; 
       int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0); 
       ptLength += cipher.doFinal(plainText, ptLength); 
       System.out.println("Decrypted Message: " + new String(plainText)); 
       System.out.println("Decrypted Message Length: " + ptLength); 
       System.out.println("Decrypted Message Length in Bytes: " + plainText.length); 
     } 
    } 

例外,我得到了

Enter a Message to be encrypted! 
test 
Input Message : test 
Generated Symmetric Key :[[email protected] 
Generated Symmetric Key Length :10 
Generated Key Length in Bytes: 16 
Encrypted Message :ýÒSœW¶Þ34Ý­GÝ 
Encrypted Message Length: 16 
Encrypted Symmetric Key :[[email protected] 
Encrypted Symmetric Key Length :128 
Encrypted Symmetric Key Length in Bytes: 128 
Decrypted Symmetric Key: [[email protected]   (Some symbols I got along with this decrypted key which I could not paste here) 
Decrypted Symmetric Key Length in Bytes: 117 
Exception in thread "main" java.security.InvalidKeyException: Key length not 128/192/256 bits. 
    at org.bouncycastle.jce.provider.JCEBlockCipher.engineInit(Unknown Source) 
    at org.bouncycastle.jce.provider.JCEBlockCipher.engineInit(Unknown Source) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at javax.crypto.Cipher.init(DashoA13*..) 
    at com.sap.srm.crpto.client.applet.MainClass.main(MainClass.java:99) 
+0

你得到這個錯誤的原因是byte []。toString()不會做你認爲它的作用。一般情況下,使用加密技術時,當您正在說話時,不需要在字節和字符之間進行轉換 - 我不確定您要在那裏做什麼,將字節轉換爲不正確的字符串,只需將其轉換回字節即可。 –

回答

9

其實有在你試着來包裝和使用非對稱RSA解開對稱密鑰不少錯誤,所以我清理了(我有沒有充氣城堡在我的機器上,所以我用了默認的Sun提供者,隨意添加需要的地方「BC」):

KeyGenerator kgenerator = KeyGenerator.getInstance("AES"); 
SecureRandom random = new SecureRandom(); 
kgenerator.init(128, random); 
Key aeskey = kgenerator.generateKey(); 

KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
kpg.initialize(1024, random); 
KeyPair kpa = kpg.genKeyPair(); 
PublicKey pubKey = kpa.getPublic(); 
PrivateKey privKey = kpa.getPrivate();  

// Encrypt the generated Symmetric AES Key using RSA cipher 
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");    
rsaCipher.init(Cipher.WRAP_MODE, pubKey); 
byte[] encryptedSymmKey = rsaCipher.wrap(aeskey);    
// RSA Decryption of Encrypted Symmetric AES key 
rsaCipher.init(Cipher.UNWRAP_MODE, privKey); 
Key decryptedKey = rsaCipher.unwrap(encryptedSymmKey, "AES", Cipher.SECRET_KEY); 

System.out.println("Decrypted Key Length: " + decryptedKey.getEncoded().length * 8); // -> 128 
0

不是一個答案,但更容易FORMAT C ode here,爲了幫助調試或檢查輸出,請在緩衝區中使用十六進制轉換,然後將其分發到日誌中。你可以使用這樣的東西。

public static String asHex (byte buf[]) 
{ 
    StringBuffer strbuf = new StringBuffer(buf.length * 2); 
    int i; 

    for (i = 0; i < buf.length; i++) { 
    if (((int) buf[i] & 0xff) < 0x10) 
    strbuf.append("0"); 

    strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
    } 

    return strbuf.toString(); 
    } 
相關問題