【问题标题】:Encoding is producing different hashes each time编码每次都会产生不同的哈希值
【发布时间】:2014-05-22 07:55:05
【问题描述】:

我有以下结构用于我的Encrypt 函数。我可能在代码结构中遗漏了一些东西,因为我是 PHP 人而不是 C#。

发生的情况是,每次在我的日志中,哈希值都会发生变化,它不应该而且应该只等于输入的一个特定哈希值。这与下一期有关..

当我使用我的测试密码“MysecretPassPhrase”时,也会发生字节长度问题。 我不想更改此密码,因为它是我的真实密码的确切长度那么我可以通过代码解决问题吗?

当我使用较长的密码(例如“MysecretPassPhrase123456”和“David”作为输入时,它每次都会输出不同的哈希值:CJ+mgAeL9x+qMLId+nHvXw==、Ladj1D+LJgZCrwPatsQsEQ== 等。

需要结构

  • 密码 Rijndael (AES)
  • 块大小 128 位(16 字节)
  • 模式 CBC(密码块链接)
  • 密钥 MD5 哈希密码
  • IV 同键
  • Base64 数据编码
  • 字符 UTF-8 编码

错误

CryptographicException: Key size not supported by algorithm System.Security.Cryptography.SymmetricAlgorithm.set_Key (System.Byte[] value) (at /Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Security.Cryptography/SymmetricAlgorithm.cs:176) APIConnector.Encrypt (System.String toEncrypt) (at Assets/APIConnector.cs:59)

代码

using System.Collections;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using System.Xml;
using System.IO;

void submit() {
  Debug.Log ("first name is: " + firstName + " encrypted is: " + Encrypt(firstName));
}


public static string Encrypt (string toEncrypt) {
  byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("MysecretPassPhrase");
  // 256-AES key
  int numBytes = System.Text.Encoding.UTF8.GetBytes(toEncrypt).Length;
  Debug.Log ("Bytes: " + numBytes);
  byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt);
  RijndaelManaged rDel = new RijndaelManaged ();
  rDel.Key = keyArray;
  rDel.BlockSize = 128;
  rDel.Mode = CipherMode.CBC;
  // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx
  rDel.Padding = PaddingMode.PKCS7;
  // better lang support
  ICryptoTransform cTransform = rDel.CreateEncryptor ();
  byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
  return Convert.ToBase64String (resultArray, 0, resultArray.Length);
}

【问题讨论】:

  • @JonathonReinhart 我没有添加提交的firstName 输入,因为它是可以解决问题的附加代码。但我使用Encrypt(firstName) 对输入进行哈希处理。
  • 上面给出的错误是“算法不支持密钥大小”。您的密钥数组是 18 字节 (UTF8),即 144 位,而不是 BlockSize 指示的 128 位。 See this article.
  • 感谢@PeterGluck,但即使将块大小更改为 144 仍然会产生相同的错误。
  • 不,您不能将块大小更改为任意值(see this article)。您必须将密钥更改为有效大小。
  • @PeterGluck Ahhh 感谢您指出这一点! +1 给你,先生。除此之外,您还看到我在代码中缺少的所需结构的其他任何内容吗?再次感谢。

标签: c# rijndael rijndaelmanaged


【解决方案1】:

上面给出的错误是“算法不支持密钥大小”。您的密钥数组是 18 字节 (UTF8),即 144 位,而不是 BlockSize 指示的 128 位。

您必须将密钥更改为有效大小。 See this article for more information.

【讨论】:

  • 感谢@PeterGluck,非常感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2020-08-17
  • 2018-10-05
  • 2017-11-23
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多