Cryptography 用AES编码文件

Cryptography 用AES编码文件,cryptography,aes,Cryptography,Aes,我正在用C编写一个服务器,我想用aes对文件进行编码 正如我所知,编码块大小应该等于AES密钥长度,所以我需要用零来补充最后一个块,使其达到所需的大小。问题在于解码:如何区分文件内容和补零?嗯,我计划使用Base64编码来实现这个目的,但是对于大文件来说不是太慢了吗?可能我应该在发送编码块之前发送文件大小?对文件进行Base64编码然后进行AES加密不是一个好主意。通过将cyphertext每个字节的高2位设置为已知值,这样做可以将可能的块数从2^64减少到2^48 我不确定这是“最佳”还是“正

我正在用C编写一个服务器,我想用aes对文件进行编码


正如我所知,编码块大小应该等于AES密钥长度,所以我需要用零来补充最后一个块,使其达到所需的大小。问题在于解码:如何区分文件内容和补零?嗯,我计划使用Base64编码来实现这个目的,但是对于大文件来说不是太慢了吗?可能我应该在发送编码块之前发送文件大小?

对文件进行Base64编码然后进行AES加密不是一个好主意。通过将cyphertext每个字节的高2位设置为已知值,这样做可以将可能的块数从2^64减少到2^48

我不确定这是“最佳”还是“正常”的方式,但我通常会在我的密码文本的开头或结尾加上几个额外的块,这些块将解密为关于文件大小、文件名、内容类型等的元数据。是的,这些块的熵非常小,但是,允许一个或两个块包含一个crib要比让每个字节都包含一个crib好得多


例如,如果你有一个10字节长的文件,你会有一个完整的cyphertext块,这个块包含两个有用的字节,后跟6个字节的填充。最后一个块将包含元数据。(实际上,元数据块可以放在开头或结尾。请随意选择。)

对文件进行Base64编码然后进行AES加密不是一个好主意。通过将cyphertext每个字节的高2位设置为已知值,这样做可以将可能的块数从2^64减少到2^48

我不确定这是“最佳”还是“正常”的方式,但我通常会在我的密码文本的开头或结尾加上几个额外的块,这些块将解密为关于文件大小、文件名、内容类型等的元数据。是的,这些块的熵非常小,但是,允许一个或两个块包含一个crib要比让每个字节都包含一个crib好得多

例如,如果你有一个10字节长的文件,你会有一个完整的cyphertext块,这个块包含两个有用的字节,后跟6个字节的填充。最后一个块将包含元数据。(实际上,元数据块可以放在开头或结尾。你自己选择。)

一个常见的方案是PKCS#5填充。基本上,用等于填充长度的字节填充(纯文本的)填充。然后,在解密后,查看最后一个字节以查看要删除的字节数。确认删除的字节相同可提供快速的健全性检查。一些十六进制的示例:

[AABBCCDD EEFF0011 22334455 667788--] -> [AABBCCDD EEFF0011 22334455 66778801]
[AABBCCDD EEFF0011 22334455 66------] -> [AABBCCDD EEFF0011 22334455 66030303]
[AABBCCDD EEFF0011 22334455 66778899] -> [AABBCCDD EEFF0011 22334455 66778899][10101010 10101010 10101010 10101010]
//the last byte must be padding, even if that requires an extra block
旁注:如果您自己实施加密,请阅读操作模式。如果没有,那么您使用的任何库都应该能够处理填充。

常见的方案是PKCS#5填充。基本上,用等于填充长度的字节填充(纯文本的)填充。然后,在解密后,查看最后一个字节以查看要删除的字节数。确认删除的字节相同可提供快速的健全性检查。一些十六进制的示例:

[AABBCCDD EEFF0011 22334455 667788--] -> [AABBCCDD EEFF0011 22334455 66778801]
[AABBCCDD EEFF0011 22334455 66------] -> [AABBCCDD EEFF0011 22334455 66030303]
[AABBCCDD EEFF0011 22334455 66778899] -> [AABBCCDD EEFF0011 22334455 66778899][10101010 10101010 10101010 10101010]
//the last byte must be padding, even if that requires an extra block

旁注:如果您自己实施加密,请阅读操作模式。如果您没有,那么您使用的任何库都应该能够处理填充。

请参阅本页有关填充方案的内容:

)

例如,对于CBC模式:

一种方法是在最后一个块中填充1位,后跟0位。如果输入恰好填充了整个块,则添加一个“虚拟块”以容纳填充;否则,输入明文的结尾可能会被误解为填充。另一种方法是使用值(n)追加n个字节−1) 在纯文本的末尾填写一个完整的块。如果消息已经完全填充了一个块,那么出于与前面相同的原因,将添加一个填充块的完整块。这意味着填充要么是0的一个字节,要么是1的两个字节,以此类推

如果使用CTR模式,甚至不需要填充,因为密文的大小与纯文本相同

正如@maybewecouldstealavan所指出的,一种流行的填充方案是RSA实验室的PKCS#5。这是OpenSSL程序用于CBC模式的填充方案

所有分组密码通常使用PKCS#5填充,也称为标准分组填充:这允许执行基本完整性或密码检查


有关填充方案,请参见本页:

)

例如,对于CBC模式:

一种方法是在最后一个块中填充1位,后跟0位。如果输入恰好填充了整个块,则添加一个“虚拟块”以容纳填充;否则,输入明文的结尾可能会被误解为填充。另一种方法是使用值(n)追加n个字节−1) 在纯文本的末尾填写一个完整的块。如果消息已经完全填充了一个块,那么出于与前面相同的原因,将添加一个填充块的完整块。这意味着填充要么是0的一个字节,要么是1的两个字节,以此类推

如果使用CTR模式,甚至不需要填充,因为密文的大小与纯文本相同

正如@maybewecouldstealavan所指出的,一种流行的填充方案是RSA实验室的PKCS#5。这是OpenSSL程序用于CBC模式的填充方案

所有分组密码通常使用PKCS#5填充,也称为标准分组填充:这允许执行基本完整性或密码检查


事实上,正是出于这个原因,我认为在加密之前压缩数据被认为是一种良好的做法。Base64的作用正好相反,它将信息扩展到更多的块。至于报头的低熵,正确使用分组密码操作模式(例如CBC)应该可以解决这个问题。事实上,我认为在加密之前压缩数据被认为是一种很好的做法。Base64的作用正好相反,将您的信息扩展为