如何在C#中将guid加密成等长字符串?

时间:2014-06-02 14:08:56

标签: c# .net encryption aes guid

我需要加密一个guid,加密的字符串长度应该是32 char max,不超过。请建议我使用C#中的加密方法。

我在CFB模式下使用AES,就像在Code Project中一样,但是它产生了64个字符长。

2 个答案:

答案 0 :(得分:3)

好吧,GUID本质上是16个字节的数据......所以这就是你应该加密的东西。这是AES中的一个块。根据Reid的评论,输出的确切大小将取决于您如何配置内容,但要将结果转换为文本,如果您需要具有相当小的ASCII文本,则可能需要使用base64。

Base64允许你使用24个字节来产生一个32个字符的结果 - 所以你应该尝试不同的填充/密码模式,直到你找到一个输出为24个字节或更少的模式,如果这32个字符的要求是“硬”的(你需要ASCII;如果你不需要ASCII,那么还有更多的空间可以玩......)

答案 1 :(得分:1)

如果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));
    }
}