c# - java解密和c#加密非法 key 大小问题

标签 c# java cryptography aes

我们通过 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;
            }

它工作正常。现在我正在创建一个 Java 应用程序,它也应该解密这些文档。最初我尝试通过这段 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();
       }

现在这是我的问题。我将其作为初始化 vector 传递

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};

并将其作为 key

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并且 jar 被放置在 jre/lib/security 和 jdk/lib/security 中。但问题仍然悬而未决,并引发非法 key 大小异常

最佳答案

根据 AES 的 key 大小,它将受到导出管制。我建议您下载无限制的 jce 管辖策略文件并将其安装到您的 Java 环境中。

AES256 将需要无限的策略文件。

关于c# - java解密和c#加密非法 key 大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14472683/

相关文章:

c# - 如何将模型数据传递给一个 Controller 到另一个 Controller

C# 将外部程序集中的属性标记为已过时?

java - 如何在不同的类中使用一个类的 String 数组,以免代码行数过多

java - 对传递给 servlet 的密码使用 sha256 是否会使其容易受到暴力攻击?

random - 非安全随机数生成器和安全随机数生成器有什么区别?

java - 如何在 Java 中读取 sha1WithRSAEncryption 公共(public) DER key ?

c# - 如何在 Windows 上获取区分大小写的路径?

c# - 如何从 C#、Process.Start ("shutdown"关闭)在 Windows XP 中不起作用

javascript - HTMLUnit 不等待 JavaScript

java - 继续接收 : javax. el.PropertyNotFoundException : Target Unreachable, 'null' 返回 null