我需要加密一个guid,加密的字符串长度应该是32个字符,不超过这个。请建议我c#中可用的加密方法。
我在CFB模式下使用AES,就像在Code Project中一样,但这会产生64个字符长的
GUID本身就是16字节的数据…这就是你要加密的。这是AES中的一个块。根据Reid的评论,输出的确切大小将取决于您如何配置东西,但是要将结果转换为文本,如果您需要具有相当小大小的ASCII文本,则可能需要使用base64。
Base64允许你使用24字节来产生32个字符的结果-所以你应该尝试不同的填充/密码模式,直到你找到一个输出是24字节或更少的,如果这个32个字符的要求是一个"硬"的(你需要ASCII;如果你不需要ASCII,那么有更多的空间来发挥…)
如果GUID是16字节(我将把它作为给定的),那么你可以简单地做一个AES ECB模式加密而不填充明文(即GUID)的。然后可以转换为十六进制。这将100%确定地产生32个字符的结果。
请注意,ECB不使用IV,这意味着您可以区分不同的GUID彼此(因为每个GUID将被映射到一个密文)。但在其他方面,密文应该与使用的分组密码和密钥的安全性相同。
public class EncryptGUI
{
private Aes aes;
public EncryptGUI (byte[] key)
{
aes = Aes.Create ();
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.None;
aes.Key = key;
}
public String encryptUID (byte[] guid)
{
ICryptoTransform aesDecryptor = aes.CreateDecryptor ();
byte[] result = aesDecryptor.TransformFinalBlock (guid, 0, guid.Length);
return ToHex (result);
}
public static string ToHex (byte[] data)
{
StringBuilder hex = new StringBuilder (data.Length * 2);
foreach (byte b in data)
hex.AppendFormat ("{0:x2}", b);
return hex.ToString ();
}
public static void Main (string[] args)
{
byte[] key = new byte[16];
EncryptGUI main = new EncryptGUI (key);
byte[] guid = new byte[16];
Console.Out.WriteLine (main.encryptUID (guid));
}
}