快速,简单易用的对称密码,用于Java中的整数加密

在Java中,具有这些属性的整数加密的密码函数是什么?:

  • 快速
  • 对称密钥算法
  • 使用简单(即使用几行代码而不包含外部库)
  • 可以指定输出长度(例如20个字符)

我只需要用它来加密/解密整数。

没有外部库的要求将列表减少到DES,3DES和AES。 DES和3DES的块大小为64位,而AES的块大小为128位。 有不同的方面,可以检查这一点。

密文大小

DES和3DES最适用于最多56位宽(非全长)的整数,因为结果将是一个8字节的单块,因为填充。 如果加密一个完整的long值,则会添加一个额外的填充块。

AES将始终为任何长值的int生成一个16字节的密文。

速度

根据这一分析, AES(Rijndael-128)的速度是DES / 3DES的两倍多,密钥尺寸更大(更安全)。 当CPU支持AES-NI时,AES甚至可以比DES或3DES快得多。 所有当前的CPU都支持这一点。 这是我从openssl speed命令获取的当前结果。

对于16字节有效载荷,AES达到127MB / s,而3DES仅达到27MB / s。 这是要搜寻的数据。

安全

不要将DES用于任何严重的事情,因为它只有56位密钥(带有奇偶校验的64位密钥)。 暴力迫使成本为2 56 。 3DES也不是那么好,因为Brute强制成本是2 112 。 AES的强制成本是2 128,2 192,2 256,具体取决于使用的密钥大小。

可能使用AES:

 private final String CIPHER_NAME = "AES/ECB/PKCS5Padding"; private final String ALGORITHM_NAME = "AES"; // keySizes 128, 192, 256 // private final String CIPHER_NAME = "DES/ECB/PKCS5Padding"; // private final String ALGORITHM_NAME = "DES"; // keySize 56 // private final String CIPHER_NAME = "DESede/ECB/PKCS5Padding"; // private final String ALGORITHM_NAME = "DESede"; // keySize 168 byte[] encrypt(SecretKey key, long num) { BigInteger bignum = BigInteger.valueOf(num); Cipher cipher = Cipher.getInstance(CIPHER_NAME); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(bignum.toByteArray()); } long decrypt(SecretKey key, byte[] ct) { Cipher cipher = Cipher.getInstance(CIPHER_NAME); cipher.init(Cipher.DECRYPT_MODE, key); byte[] pt = cipher.doFinal(ct); BigInteger bignum = new BigInteger(pt); return bignum.longValue(); } SecretKey keyGen(String algorithm, int keySize) { KeyGenerator keygen = KeyGenerator.getInstance(algorithm); keygen.init(keySize); return keygen.generateKey(); } 

操作模式

在这里我使用ECB模式。 使用它通常不是一个好主意。 它存在一个问题,即使用相同的密钥加密相同的明文会产生相同的密文。 这可能不是可接受的财产。 如果不可接受,那么您需要使用例如带有新随机IV的CBC模式。 随着将通过一个额外的块炸毁密文。

如果您不需要安全的解决方案,只需要快速 解决方案 ,请考虑XOR密码 :

 int key = ... .... int b = a ^ key; int c = b ^ key; assert (c == a); 

如果您需要任何安全性,则不应自行实施密码。 有太多可能出错的地方。

但您可以将数字写入byte[]并使用Java提供的密码,如本答案中所述 。