使用 AesCng 生成 AES 加密密钥

Posted

技术标签:

【中文标题】使用 AesCng 生成 AES 加密密钥【英文标题】:AES encryption key generation using AesCng 【发布时间】:2021-04-11 05:19:12 【问题描述】:

我正在使用AesCng 使用以下代码生成加密密钥:

using System;
using System.Security.Cryptography;
using System.Text;

namespace EncryptionTest

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine(Encoding.UTF8.GetString(GenerateKey()));
        

        static byte[] GenerateKey()
        
            using (AesCng cng = new AesCng())
            
                cng.GenerateKey();
                return cng.Key;
            
        
    

当我检查控制台中的密钥时,它显示为r?▬?^?-?▲?ZQ^???♥$)??8w?f▬?[??

看起来有些字符没有得到解决。有人可以帮我理解我做错了什么吗?

【问题讨论】:

你有一个byte[] 并且似乎你想要打印字符串表示。我想你会想使用Convert.ToBase64String(GenerateKey()) 【参考方案1】:

AES 密钥只是一系列字节。不保证这些字节是可打印的字符,无论是 UTF8、ASCII 还是任何其他字符编码。这是正常的,生成的key没有问题。

一般来说,如果你想将一系列任意字节转换成可打印的字符串,你会使用 Base-64 编码,像这样:

Console.WriteLine(Convert.ToBase64String(GenerateKey()));

这会给你一个类似这样的输出:

VX/oYK1P5LQAH5MqiRHyNDtZyNcQGEUpIRpnpsY+buk=

小提琴:https://dotnetfiddle.net/5bDi0c

有关更多信息和示例,请参阅 Convert.ToBase64String(byte[])Convert.FromBase64String(string)

【讨论】:

所以,回答 OP 的问题:你没有做错任何事。你看到的钥匙没问题。

以上是关于使用 AesCng 生成 AES 加密密钥的主要内容,如果未能解决你的问题,请参考以下文章

Java使用AES加解密

Android 中的 AES 密钥生成

为啥我的 AES 加密会引发 InvalidKeyException?

何时使用动态 AES 加密和固定密钥 AES 加密?

我如何使用 php 生成 AES-256 对称密钥

如何安全地为 AES CBC 加密生成 IV?