怎么用C#实现和Java的SHA1PRNG 256位互通的加解密?

在Java中使用AES进行加解密的时候,有时候会使用256位的key且摘要算法使用SHA1PRNG生成32字节(256位)的密钥。但是如果使用256位,那么在C#中就不能解密了。经过分析C#中的SHA1CryptoServiceProvider生成的key摘要只有160位(20字节)。
Java代码如下:

public static String aesDecrypt(byte[] content, String password) throws Exception{
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" );
    secureRandom.setSeed(password.getBytes("UTF-8"));
    kgen.init(256,secureRandom);
    SecretKey originalKey = kgen.generateKey();
    byte[] encoded = originalKey.getEncoded();
    SecretKey secretKey = new SecretKeySpec(encoded, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    byte[] result = cipher.doFinal(content);

    return new String(result, "UTF-8");
}

对应C#中进行解密

public static byte[] AesDecypt(byte[] contents, string secretKey)
{
    try
    {
        byte[] keyBytes = null;
        using (var sha1 = new SHA1CryptoServiceProvider())
        {
            byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(secretKey));
            var rd = sha1.ComputeHash(hash);
            keyBytes = rd.Take(16).ToArray();
        }

        RijndaelManaged rm = new RijndaelManaged
        {
            Key = keyBytes,
            Mode = CipherMode.ECB,
            Padding = PaddingMode.PKCS7
        };

        ICryptoTransform cTransform = rm.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(contents, 0, contents.Length);

        return resultArray;
    }
    catch
    {
        return contents;
    }
}

如上面Java加密的用C#久不能解密,因为SHA1CryptoServiceProvider最多生成20字节160的摘要。

请问各位专家,C#中有对应的方法吗?非常感谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值