使用Rijndael在Java中加密并在C#中解密

4
使用Rijndael算法,可以加密配置文件(或配置文件中的部分内容),然后在Java中解密该文件。以下假设成立:
  1. 传递IV(不是自动生成的Idea :: GenerateIV();)
  2. 传递密钥
  3. 块大小为128(标准)
假设这样做是可行的,我的下一个问题是:
  1. 密钥长度是否可以为256?我知道128是AES,但我们想使用256。我也不知道Java是否有256位的提供程序,或者我需要使用BouncyCastle。
  2. 填充是什么?PKCS7?
  3. 我假设CipherMode将是CBC
类似于C#中的代码?但是,我不知道它是否可以在Java中解密...甚至我的C#代码是否正确?
public static void initCrypt()
    {
        byte[] keyBytes = System.Text.UTF8Encoding.UTF8.GetBytes("abcdefghijklmnop");

        rijndaelCipher = new RijndaelManaged();
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(keyBytes, new SHA1CryptoServiceProvider().ComputeHash(keyBytes));
        byte[] key = pdb.GetBytes(32);
        byte[] iv = pdb.GetBytes(16);
        rijndaelCipher.Mode = CipherMode.CBC;
        rijndaelCipher.Padding = PaddingMode.PKCS7; //PaddingMode.PKCS7 or None or Zeros
        rijndaelCipher.KeySize = 256; //192, 256
        rijndaelCipher.BlockSize = 128;
        rijndaelCipher.Key = keyBytes;
        rijndaelCipher.IV = iv;
    }
3个回答

2
我会检查是否有外部库,例如 keyczar 支持此功能。
正如 Jeff Atwood 最近在他的博客中所教导我们的那样,99% 的开发人员不应该关注加密算法的低级细节(因为我们可能会搞砸它们)。(原文链接)

当然可以 - 这就是我为什么推荐使用外部程序的原因。 - Tom Ritter
他提到了使用bouncycastle作为一个抽象的例子。我确实想要这样做,所以我并没有做太多不同的事情...我只是想要确保提供商在跨平台上正常工作。 - yantwill
1
加密算法只是算法,对吧?所以它的任何部分都不应该与平台有关。你可以在一种语言中采取的任何一系列步骤来加密文件,你都应该能够编写代码在任何其他语言中解密它。如果不能,那么你的算法就有问题。 - matt b

1
根据您对此配置文件的使用情况,您可能希望使用外部程序。
例如,如果您想在磁盘上保护配置文件,但在程序运行时允许其内容保存在内存中,您可以使用gpg加密文件,使用用户提供的密码解密到内存中,并在关闭程序时清除内存。[1]
[1] 值得注意的是,由于内存分页等原因,无法真正保证内容不会被写入磁盘。这取决于操作系统和许多因素,如果您感兴趣,可以查阅相关资料。

0

问题1:必须是128,否则您将不得不使用BouncyCastle

问题2:是的,PKCS7

问题3:是的,CBC

如果您的问题还没有解决,我可以给您提供C#和Java的工作示例。


我很想看看例子。我正在尝试做类似的事情。 - CJ Garber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接