如何使用C#中的MACTripleDES加密和解密字符串? MACTripleDES和TripleDES之间有什么区别吗?
答案 0 :(得分:3)
MACTripleDES使用CBC-MAC。在用零填充消息之后,CBC-MAC使用CBC模式。这在撤销的FIPS 113规范(DAA)中规定。只保留最后一个块:
这意味着在此之前的每个明文数据块都无法检索。也就是说,除非您知道最后一个块的明文,否则您可以使用最后一个块对其进行异或,检索先前的密文,并通过解密来计算明文。
另一方面,CBC模式下的TripleDES输出所有密文块,之前使用它作为下一个明文块的向量。
using System;
using System.Security.Cryptography;
namespace StackOverflow
{
public class MACTripleDESTest
{
public static void Main(String[] args)
{
// example key
byte[] key = new byte[24];
for (int i = 0; i < key.Length; i++)
{
key[i] = (byte) i;
}
// uses CBC MAC with zero initialization vector and Zero padding
MACTripleDES macTDES = new MACTripleDES(key);
byte[] result = macTDES.ComputeHash(new byte[] { 0x01, 0x02, 0x03, 0x04 });
TripleDES tdes = new TripleDESCryptoServiceProvider();
tdes.Key = key;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.None;
ICryptoTransform tf = tdes.CreateDecryptor();
byte[] pt = tf.TransformFinalBlock(result, 0, tdes.BlockSize / 8);
Console.WriteLine(BitConverter.ToString(pt));
}
}
}
将导致:
01-02-03-04-00-00-00-00
使用AES-CMAC,HMAC或经过身份验证的加密。
答案 1 :(得分:2)
Message Authentication Code (MAC)类似于哈希,因为您无法解密&#34;它。输入通常是一些任意长的消息,但输出的大小为三重DES块大小,限制为64位。由于输入可能大于输出,因此您应该很容易看到它无法解密&#34;,因为同一输出值有多个可能的输入值。这称为Pigeonhole principle。
如果输入小于或等于块大小,则可能能够解密认证标记以获得相应的输入。是否可以这样做取决于实际的MAC算法。例如,CBC-MAC具有此不受欢迎的属性,即短消息被简单加密,这可能导致消息伪造和机密性中断。还有更好的替代方案,例如CMAC(OMAC1),它也基于一些分组密码或基于安全散列函数的HMAC。 MACTripleDES
is an implementation of CBC-MAC,绝对不能使用。
通常,MAC用于验证消息。由于消息的接收者知道消息和用于创建MAC(密钥认证)的密钥,因此她可以运行MAC算法来生成认证标记,并将其与消息一起发送的标记进行比较。 。如果两个标签相同,则接收方可以合理地确定在传输过程中没有操纵消息或标签。