什么加密方案满足十进制明文和密文的要求并保留长度?

use*_*479 7 c++ encryption cryptography aes

我需要一种加密方案,其中明文和密文完全由十进制数字组成.

另外,明文和密文的长度必须相同.

底层加密算法也应该是行业标准.我不介意它是对称的(例如AES)还是非对称的(例如RSA) - 但它必须是一个公认的算法,我可以获得一个FIPS-140批准的库.(否则它将无法通过安全审查阶段).

使用AES OFB可以保留基于十六进制的输入的长度(即每个字节有256个可能的值:0x00 - > 0xFF).但是,这对我来说不起作用,因为明文和密文必须完全是十进制的.

注意:"完全小数"可以用两种方式解释 - 这两种方式都可以满足我的要求:

  1. 输入和输出字节是字符'0' - >'9'(即字节值:0x30 - > 0x39)
  2. 输入和输出字节有100(十进制)值:0x00 - > 0x99(即BCD)

更多信息:最大明文和密文长度可能是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的长度没有限制.

Baf*_*ois 7

使用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仍应产生随机输出.