在 C# 中对字节数组进行编码对于 AES 的安全性是否重要?

本文关键字:安全性 AES 是否 字节 字节数 数组 编码 | 更新日期: 2023-09-27 18:32:12

我有一个使用 AES 加密的字节数组,密码短语使用 SHA-256 加密。一切都很完美,但我想知道最后一部分,我必须对由于加密而获得的字节数组进行编码。为了最终结果的健壮性,字节数组如何加密、Base64、转换为十六进制值,还有其他东西,这是否重要?

从逻辑上讲,这并不重要,因为实际上没有那么多编码方法,而且大多数时候使用最明显的编码方法Base64。但由于我对密码学不是那么精通,我只想确定一下。

字节数组为例(以随机字节数组为例):

    [0] 182 
    [1] 238 
    [2] 54
    [3] 24  
    [4] 69  
    [5] 224 
    [6] 105 
    [7] 13  
    [8] 5   
    [9] 52  
    [10]112 
    [11]71  
    [12]250 
    [13]163 
    [14]234 
    [15]234

这给出了 Base64 中可能的结果(随机结果,与上面不匹配):

ou+yUEkilfrGIF3HBH08vu8A==

使用BitConvertor将其转换为十六进制值得到(随机结果,与上面不匹配):

A2EBCA1945E8BC920532F068D27BAEF1

将上述结果转换回相应的字节数组很简单,然后才开始困难部分。

在 C# 中对字节数组进行编码对于 AES 的安全性是否重要?

为了最终结果的健壮性,字节数组如何加密、Base64、转换为十六进制值,还有其他东西,这是否重要?

不,一点也不。只要您以无损格式(base64 和 hex 都是)对其进行编码,就可以了。不要使用类似Encoding.ASCII.GetString(...)的东西 - 那将是有损和不合适的。(不要将Encoding用于此任务。

只要问问自己是否可以反转编码并返回到原始字节 - 如果是这样,你没事。(对于十六进制和base64也是如此,假设它已正确实现。

这样

看。密码必须产生密文,在不知道密钥的情况下(实际上)不可能从中获取明文:

C=E(K,M) // K is key, M message

现在,您拥有的是密文。无论你是在 Base64 中编码还是其他东西并不重要,因为密码在生成密文时已经完成了它的工作。之后你可以用它做任何事情 - 密码在生成密文时已经完成了它的工作,它告诉你如果你不使用原始密钥,就不可能检索纯文本。

因此,无论您之后做什么,例如如何编码/解码密文,都无关紧要。