2013-01-23 57 views
1

我们加密/用C#应用程序
的Java decrytpion&C#加密非法密钥大小问题

var msData = new MemoryStream(); 
      CryptoStream cs = null; 
      if (inputFileStream.CanSeek) 
       inputFileStream.Seek(0, SeekOrigin.Begin); 
      try 
      { 
       long inputFileLength = inputFileStream.Length; 
       var byteBuffer = new byte[4096]; 
       long bytesProcessed = 0; 
       int bytesInCurrentBlock = 0; 

       var csRijndael = new RijndaelManaged(); 
       switch (action) 
       { 
        case CryptoAction.Encrypt: 
         cs = new CryptoStream(msData, csRijndael.CreateEncryptor(this.Key, this.IV), CryptoStreamMode.Write); 
         break; 

        case CryptoAction.Decrypt: 
         cs = new CryptoStream(msData, csRijndael.CreateDecryptor(this.Key, this.IV), CryptoStreamMode.Write); 
         break; 
       } 

       while (bytesProcessed < inputFileLength) 
       { 
        bytesInCurrentBlock = inputFileStream.Read(byteBuffer, 0, 4096); 
        cs.Write(byteBuffer, 0, bytesInCurrentBlock); 
        bytesProcessed += bytesInCurrentBlock; 
       } 
       cs.FlushFinalBlock(); 

       return msData.ToArray(); 
      } 
      catch(Exception ex) 
      { 
       new Com.Library.SqlLog().InsertSqlLog(Auth.currentMemberInfo.LoginId, MethodInfo.GetCurrentMethod().Name, ex); 
       return null; 
      } 

,它是工作fine.Now我创建一个Java应用程序,它是从这个代码解密我们组织的文档应该too.Initially解密这些文件我试图通过这个代码的Java

try{ 


    AlgorithmParameterSpec paramSpec = new IvParameterSpec(IV); 
    Cipher cipher = Cipher.getInstance("AES"); 
    SecretKeySpec key = new SecretKeySpec(keyGen, "AES"); 
    cipher.init(Cipher.DECRYPT_MODE, key, paramSpec); 
    byte[] output = new BASE64Decoder().decodeBuffer(new String(convertDocToByteArra("//Path/somePDF.pdf"))); 

    byte[] decrypted = cipher.doFinal(output); 

    convertByteArrayToDoc(decrypted); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

现在这里来解密文件是我的疑难问题。通过这个作为初始化向量

static byte IV[] = new byte[] {0x0E,0x15,(byte)0xC4,(byte)0xBB, 
      (byte)0xEE,(byte)0xDF,0x72,0x0C,0x4F,0x7E,(byte)0xBE,0x67,0x4A,(byte)0xB6,0x45,(byte)0xDE}; 

并将此作为一个重要

static byte[] keyGen = new byte[]{0x78,(byte)0x9C,(byte)0xF1,0x01,0x12,0x31,(byte)0xCD,0x1E,0x1F,0x16,0x54,0x19,0x1D,(byte)0xFF,(byte)0xC7, 
      0x00,0x51,(byte)0xBF,(byte)0xFD,0x31,(byte)0xE1,(byte)0xA1,(byte)0xDC,(byte)0xC9,0x23,0x49,(byte)0xAD,0x11,0x16,0x17,0x1D,0x1F}; 


但是当我运行这个程序,然后将它抛出以下

java.security.InvalidKeyException: Illegal key size 
    at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1023) 
    at javax.crypto.Cipher.implInit(Cipher.java:789) 
    at javax.crypto.Cipher.chooseProvider(Cipher.java:848) 
    at javax.crypto.Cipher.init(Cipher.java:1347) 
    at javax.crypto.Cipher.init(Cipher.java:1281) 
    at DecryptAspEncryptedDocs.main(DecryptAspEncryptedDocs.java:80) 

现在给出一个例外,我坚持在这里做不知道该怎么做。任何帮助将不胜感激。

编辑1:
我见过this question和罐子放在JRE/lib/security中和JDK/lib目录/ security.But仍然问题挂起并抛出illegal key size异常

+0

适用于我(当我将模式更改为CBC时)。 –

+0

@GregS我提供了AES/CBC/NoPadding,但它再次说“非法密钥大小” – Despicable

+0

正如我所说,它适用于我,我知道我已经安装了无限制的加密策略。尽管有你的信仰,但你似乎没有。也许您安装了多个Java版本,或者您错误地安装了策略文件。 –

回答

1

取决于密钥大小对于AES,那么它将受到出口控制。我建议你下载无限制的jce权限策略文件并将它们安装到你的Java环境中。

AES256将要求无限制的策略文件。

+0

是的,我通过检查这个问题做了这件事http://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters – Despicable

0

在README中没有明确指出“JCE Unlimited Strength Jurisdiction Policy Files”应该被复制到JDK中的jre,否则它将无法工作。文件路径应为:/path/to/jdk1.7.0_xx/jre/lib/security