use*_*479 7 c++ encryption cryptography aes
我需要一种加密方案,其中明文和密文完全由十进制数字组成.
另外,明文和密文的长度必须相同.
底层加密算法也应该是行业标准.我不介意它是对称的(例如AES)还是非对称的(例如RSA) - 但它必须是一个公认的算法,我可以获得一个FIPS-140批准的库.(否则它将无法通过安全审查阶段).
使用AES OFB可以保留基于十六进制的输入的长度(即每个字节有256个可能的值:0x00 - > 0xFF).但是,这对我来说不起作用,因为明文和密文必须完全是十进制的.
注意:"完全小数"可以用两种方式解释 - 这两种方式都可以满足我的要求:
更多信息:最大明文和密文长度可能是10个十进制数字.(即如果使用'0' - >'9'则为10个字节,如果使用BCD则为5个字节)
请考虑以下示例以了解AES失败的原因:输入字符串是8位数字.最大8位数字是:99999999在十六进制中,这是:0x5f5e0ff
这可以视为4个字节:<0x05> <0xf5> <0xe0> <0xff>
如果我使用AES OFB,我将得到4字节输出.
最高可能的4字节密文输出为<0xFF> <0xFF> <0xFF> <0xFF>
将其转换回整数给出:4294967295即10位数字.
==>两位数太长.
最后一件事 - 所需的任何键/ IV的长度没有限制.
使用AES/OFB或任何其他流密码.它将生成伪随机位的密钥流.通常,您可以使用明文对这些位进行异或.代替:
For every decimal digit in the plaintext
Repeat
Take 4 bits from the keystream
Until the bits form a number less than 10
Add this number to the plaintext digit, modulo 10
Run Code Online (Sandbox Code Playgroud)
要解密,请执行相同操作,但在最后一步中减去.
我相信这应该与正常使用流密码一样安全.如果数字0-15的序列与随机无法区分,则只有小于10的数字的子序列仍应是随机的.如果其中一个输入是随机的,则使用加/减而不是XOR仍应产生随机输出.