Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 为了HMAC的目的,允许使用AES 256对任何数据进行解密_C#_Security_Encryption_Hash_Hmac - Fatal编程技术网

C# 为了HMAC的目的,允许使用AES 256对任何数据进行解密

C# 为了HMAC的目的,允许使用AES 256对任何数据进行解密,c#,security,encryption,hash,hmac,C#,Security,Encryption,Hash,Hmac,考虑一个将由我将编写的C#库加密的文件,该库由一个64字节的HMAC组成,后面紧跟着用AES 256加密的加密数据。16字节IV、32字节密钥和64字节HMACSHA512初始化密钥将通过用户输入的单个字符串密码来自Rfc2898DeriveBytes(4096次迭代,以及random.org提供的单个salt) 此设计是否有任何负面安全影响 我是不是太过火了?(它使用64字节的初始化键或4096次迭代) 我希望能够解密任何数据,以便使用嵌入式HMAC验证密码是否正确(即“解密文件是原始文件”)

考虑一个将由我将编写的C#库加密的文件,该库由一个64字节的HMAC组成,后面紧跟着用AES 256加密的加密数据。16字节IV、32字节密钥和64字节HMACSHA512初始化密钥将通过用户输入的单个字符串密码来自Rfc2898DeriveBytes(4096次迭代,以及random.org提供的单个salt)

  • 此设计是否有任何负面安全影响

  • 我是不是太过火了?(它使用64字节的初始化键或4096次迭代)

  • 我希望能够解密任何数据,以便使用嵌入式HMAC验证密码是否正确(即“解密文件是原始文件”)。具体来说,我希望避免诸如“填充无效且无法删除”之类的错误。你有什么想法吗

  • 是的,IV应该在密文前面,并且应该是随机的。如果使用Rfc2898DeriveBytes,每次都会得到相同的IV,因此加密不同的纯文本将导致相同的密码文本,从而泄漏信息

  • 是的,64字节的初始化密钥有点多。16到32字节就足够了。也就是说,这对性能没有多大影响,所以。。。4Ki迭代很好(为什么不只是4000次,算法不会改变)

  • 是的,将HMAC放置在加密数据上,并确保在解密(最后一个块)之前验证HMAC。通常,HMAC放在密文之后(因为流媒体实现只有在加密所有密文后才知道HMAC)


  • 或者,您可以在GCM模式下使用AES,这样您就不再需要HMAC了。但GCM(或EAX)模式并不总是可用。

    1。每次使用相同的密钥/IV加密数据时,必须使用a,否则会破坏安全性。2.您可能想看一看。@dtb使用相同的salt从密码派生密钥是可以的;从密码派生IV是一个问题。没错,我把salt与nonce/IV混淆了。不过,选择不同的salt会导致不同的IV。只是澄清一下:输入的密码、固定salt和4096次迭代将提供给Rfc2898DeriveBytes,以生成HMAC初始化密钥的字节数组数据,以及加密算法的密钥和IV。要完成我的回答,我需要知道HMAC值的用途。我不清楚它是用来检查提供的密码是否正确,还是用来检查纯文本或密码是否正确。这个答案有什么问题吗?Nicholas?“不清楚”上有没有遗漏的部分?这是部分答案。您是否建议加密结果由edata+IV+HMAC组成,其中edata是加密数据,IV是原始IV,HMAC是未加密数据的HMAC?或者,您是否建议将HMAC基于密码(因此破解密码是否更容易)?在GCM中使用AES会防止使用错误密码解密数据的异常吗?它会验证解密的数据吗?谢谢你到目前为止的投入。很高兴知道其余的信息。@NicholasHill Owlstead的“密文”(即纯文本的反面)术语与您的“edata”术语相同。理想的结果应该是IV+EDATA+HMAC(IV+EDATA),这样您就不必复制缓冲区来改变顺序,这就是他谈论流式实现的原因。AES-GCM在一种算法中进行加密和身份验证,因此您不必担心各种问题,例如何时以及如何正确进行身份验证,专家为您完成了这项工作。