我需要一种加密方案,其中明文和密文完全由十进制数字组成.
另外,明文和密文的长度必须相同.
底层加密算法也应该是行业标准.我不介意它是对称的(例如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的长度没有限制.
谁能解释一下这是如何工作的?
#define BX_(x) ((x) - (((x)>>1)&0x77777777) \
- (((x)>>2)&0x33333333) \
- (((x)>>3)&0x11111111))
#define BITCOUNT(x) (((BX_(x)+(BX_(x)>>4)) & 0x0F0F0F0F) % 255)
Run Code Online (Sandbox Code Playgroud)
理想情况下,答案将从以下方面开始:
宏:"BX_"从传入的数字中减去三个值.
这三个值代表:
这允许BITCOUNT()按如下方式工作......
干杯,
大卫