C# 如何:ASCII到十六进制值加密应始终产生512位数据

C# 如何:ASCII到十六进制值加密应始终产生512位数据,c#,.net,encryption,C#,.net,Encryption,是否有任何良好且强大的加密/解密可用,其结果总是512位的数据值,并且该值需要转换为十六进制值 基本上我的需要就是这样做 ASCII->十六进制值->保存数据时,我需要加密十六进制值,它将是另一个十六进制值,但始终只有512位数据 环境:.NET 4.5,C#,应与SQL Server 2008 R2和SQL Server 2012兼容现代加密算法始终处理字节序列,而不是符号。考虑这个 在本例中,使用Unicode(UTF-16)编码将源字符串转换为字节序列。此字节序列通过TransformFi

是否有任何良好且强大的加密/解密可用,其结果总是512位的数据值,并且该值需要转换为十六进制值

基本上我的需要就是这样做

ASCII->十六进制值->保存数据时,我需要加密十六进制值,它将是另一个十六进制值,但始终只有512位数据


环境:.NET 4.5,C#,应与SQL Server 2008 R2和SQL Server 2012兼容

现代加密算法始终处理字节序列,而不是符号。考虑这个

在本例中,使用Unicode(UTF-16)编码将源字符串转换为字节序列。此字节序列通过TransformFinalBlock()方法调用使用对称算法加密

这里最重要的是填充。MSDN示例使用默认的AES加密模式设置:带有随机IV和PKCS7填充的CBC模式。这意味着纯文本字节一次处理一个AES块(16字节)。如果纯文本大小不是16字节的倍数,则通过在其末尾添加几个字节,最终纯文本块正好是16字节。例如,如果最后一个纯文本块有10个字节,它将额外扩展6个字节。这些字节的值是添加的字节数(0x06)。如果消息长度是16字节的倍数,将添加一个完整的填充块。该块将用值16==0x10填充

因此,使用CBC模式和PKCS7填充,25个明文字节将始终填充为32个密文字节。请记住,在这种模式下,应该为每个加密字符串随机选取IV,因此生成的密文必须包含32+16=48字节。通常,使用经过身份验证的加密是明智的。在加密文本中添加MAC标签将使密文大小增加16个字节(至少)。因此,使用random IV和MAC,原来的25字节将变成32+16+16=64字节或512位。您将能够以这种方式加密多达31个字节。加密32..47字节将在生成的密文中添加另一个块(16字节)

如果这种填充模式不适合您的需要,您可以将填充模式设置为
None
,并按如下方式实现您自己的填充:

Aes myAes = Aes.Create();
myAes.Padding = PaddingMode.None;
byte[] plaintext = Encoding.ASCII.GetBytes(text);
//do something with plaintext so that its length becomes multiple of block size:
byte[] paddedPlaintext = MyPaddingScheme(plaintext);
//Encrypt paddedPlaintext using myAes instance
不过,我必须警告您,错误的填充方案可能会使您的加密不安全。明智的做法是根据您的需要调整一些现有结构


当然,密文不会只包含ASCII字符。您可以手动将其逐字节转换为十六进制,或使用
convert.ToBase64String()
将其存储在数据库列中。

原始数据的大小是多少?目前我们的数据大小总共为25个字节(23个数字和2个字母数字)[aaxxxxxxxxxxxxxxxxxxxxxxxx]好的,所以这听起来是可行的-但是你可能有512位的输入数据(或者接近这个数字)?我们现在预测的原始数据可能是30-35字节的最大值,但目前不一定预测完整的512位。好的,那么你能不能选择任何加密方案,只给你少于512位(有很多可供选择)并在必要时进行填充(ASCII和十六进制部分有些不相关-实际上,您只有“少量数据”,并且希望将其加密为512位。)Pavel zhuravlev这听起来是可行的,但是关于引入MAC标签,您能提供更多信息吗?同时,我们将研究这个对称算法概念并进行测试。@aioracle标准.Net加密库包含一系列MAC生成算法。基于SHA的HMAC非常好(例如,请参见
HMACSHA256
class)。不幸的是,它们的标记长度超过16字节(无法容纳512位)。请注意,您可以使用一些标准化的身份验证加密模式(加密和MAC在一个包中)。AES-GCM模式可能适合您的任务。在.Net标准库中未提供此模式,因此请查看此so问题以了解更多选项:我们已成功实现解决方案。ASCII->Encrypt(32位)->十六进制转换。谢谢。我将在业余时间研究MAC生成算法。再次感谢您的指导。
Aes myAes = Aes.Create();
myAes.Padding = PaddingMode.None;
byte[] plaintext = Encoding.ASCII.GetBytes(text);
//do something with plaintext so that its length becomes multiple of block size:
byte[] paddedPlaintext = MyPaddingScheme(plaintext);
//Encrypt paddedPlaintext using myAes instance