【问题标题】:Convert java encryption to c#将java加密转换为c#
【发布时间】:2022-01-25 17:57:34
【问题描述】:

我正在努力将以下代码转换为 c#:

private SecretKey generateSecretKey(char[] key, byte[] salt) {
  this.FACTORY = SecretKeyFactory.getInstance("PBEWithHmacSHA256AndAES_256");
  KeySpec spec = new PBEKeySpec(key, salt, 65536, 256);
  SecretKey tmp = this.FACTORY.generateSecret(spec);
  return new SecretKeySpec(tmp.getEncoded(), "AES");
} 

c#中PBEWithHmacSHA256AndAES_256/PBEKeySpec背后对应的算法是什么?

然后将 java 代码用于这样的事情:

this.secretKey = generateSecretKey(this.key, newSalt);
Cipher c = Cipher.getInstance("AES/CBC/PKCS5PADDING");
c.init(2, this.secretKey, new IvParameterSpec(IV));

我还注意到C#中不存在PKCS5PADDING 可以用PKCS7替换吗? 任何帮助将不胜感激!

【问题讨论】:

    标签: java c#


    【解决方案1】:

    我做了一个快速的研究,你去吧!

    Seems the 7 & 5 padding algs. are the same.
    Try using a separate library, such as BouncyCastle.
    Encrypt string with Bouncy Castle AES/CBC/PKCS7

    好的,看来我们可以解决您的部分问题,但不幸的是 Bouncy Castle doesn't supportPBEWITHHMACSHA256ANDAES_256。

    想到的最后一个想法是使用 IKVM.net。我知道不建议这样做,但应该可以。 找到源代码并使用 PBEWITHHMACSHA256ANDAES_256 提供程序重新编译它,例如com.sun.crypto.provider.SunJCE。 有关重新编译 here 的更多信息。

    在 .Net 中,为了生成 PBKDF2 哈希,您可以使用 Rfc2898DeriveBytes

    Example:

    using (var pbkdf2 = new Rfc2898DeriveBytes(
        password,
        saltBytes,
        interactionCount,
        HashAlgorithmName.SHA256))
    {
            derived = pbkdf2.GetBytes(32);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多