Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编码每次产生不同的散列_C#_Rijndael_Rijndaelmanaged - Fatal编程技术网

C# 编码每次产生不同的散列

C# 编码每次产生不同的散列,c#,rijndael,rijndaelmanaged,C#,Rijndael,Rijndaelmanaged,我的Encrypt函数使用以下结构。我可能在代码的结构中遗漏了一些东西,因为我是一个PHP爱好者,而不是一个C 发生的事情是,每次在我的日志中,哈希值都会发生变化,它不应该也应该只等于输入的一个特定哈希值。这与下一期有关 当我使用我的测试密码短语(即“MysecretPassPhrase”)时,也会发生字节长度问题。我不想更改此密码短语,因为它是我的真实密码短语的确切长度,所以我可以在代码方面做些什么来解决此问题 当我使用一个较长的密码短语,例如“MysecretPassPhrase123456

我的
Encrypt
函数使用以下结构。我可能在代码的结构中遗漏了一些东西,因为我是一个PHP爱好者,而不是一个C

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

当我使用我的测试密码短语(即“MysecretPassPhrase”)时,也会发生字节长度问题。我不想更改此密码短语,因为它是我的真实密码短语的确切长度,所以我可以在代码方面做些什么来解决此问题

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

所需结构

  • 密码Rijndael(AES)
  • 块大小128位(16字节)
  • 模式CBC(密码块链接)
  • 密钥MD5哈希密码短语
  • 四、与钥匙相同
  • 数据编码Base64
  • 字符UTF-8编码
错误

加密异常:算法不支持密钥大小
System.Security.Cryptography.SymmetricAlgorithm.set_Key(System.Byte[]值)(at/Users/builduser/buildslave/monoAndRuntimeClassLibs/build/mcs/class/corlib/System.Security.Cryptography/SymmetricAlgorithm.cs:176)
APIConnector.Encrypt(System.String到Encrypt)(位于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);
}
上面给出的错误是“算法不支持密钥大小”。您的密钥数组是18字节(UTF8),即144位,而不是块大小指示的128位


您必须将密钥更改为有效大小

@JonathonReinhart我没有在提交的
firstName
输入中添加,因为这是一个额外的代码,将从问题中删除。但是我使用了
Encrypt(firstName)
来散列输入。上面给出的错误是“算法不支持密钥大小”。您的密钥数组是18字节(UTF8),即144位,而不是块大小指示的128位。谢谢@PeterGluck,但即使将块大小更改为144,仍然会产生相同的错误。不,不能将块大小更改为任意值。您必须将密钥更改为有效大小。@PeterGluck Ahhh谢谢您指出这一点+先生,给你一个。除此之外,您是否看到了代码中缺少的关于我所需结构的其他内容?再次感谢。谢谢@PeterGluck,非常感谢您的解释。