【问题标题】:AES encrypt file in C# and JavaC# 和 Java 中的 AES 加密文件
【发布时间】:2020-04-01 19:38:05
【问题描述】:

我用这种方法在 C# 中加密了文件:

public byte[] Crypt(byte[] filearray, string sKey)
        {
                AesManaged DES = new AesManaged();
                DES.Key = Encoding.UTF8.GetBytes(sKey);
                DES.Mode = CipherMode.ECB;
                DES.Padding = PaddingMode.PKCS7;
                ICryptoTransform crypt = DES.CreateEncryptor();
                byte[] cipher = crypt.TransformFinalBlock(niz, 0, filearray.Length);
                String encryptedText = Convert.ToBase64String(cipher);
                return cipher.ToArray();
            }

现在我尝试用 Java 解密文件:

private static byte[] transform(string base64Key, final byte[] fileBytes) throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchProviderException
   {
       final byte[] keyBytes = base64Key.getBytes(StandardCharsets.UTF_8);
       final byte[] ivBytes = base64Iv.getBytes(StandardCharsets.UTF_8);
       final SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
       final IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
       byte[] transformedBytes = null;
       try
       {
           Security.addProvider(new BouncyCastleProvider());
           final Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");;
           cipher.init(Cipher.DECRYPT_MODE, keySpec);
           transformedBytes = cipher.doFinal(fileBytes);
       }        
       catch (NoSuchAlgorithmException | NoSuchPaddingException | IllegalBlockSizeException | 
               BadPaddingException e) 
       {
           e.printStackTrace();
       }
       return transformedBytes;
   }

当我尝试执行这个函数时,我得到了异常

javax.crypto.BadPaddingException:垫块损坏 在 org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher.doFinal(未知来源) 在 org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(未知来源) 在 javax.crypto.Cipher.doFinal(Cipher.java:2165)

【问题讨论】:

  • 填充很好。用base64传输数据呢?

标签: java c# servlets encryption aes


【解决方案1】:

尝试使用不同的填充,例如:

Cipher.getInstance("AES/ECB/NoPadding");

Cipher.getInstance("AES/ECB/PKCS5Padding");

而不是

Cipher.getInstance("AES/ECB/PKCS7Padding");

【讨论】:

  • 能否将部分答案格式化为代码,使其更具可读性?
  • NoPadding 不是有用的填充,您必须自己进行填充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多