Java中有什么用于具有这些属性的整数加密的密码函数?:
我只需要用它来加密/解密整数。
答案 0 :(得分:5)
没有外部库的要求将列表减少到DES,3DES和AES。 DES和3DES的块大小为64位,而AES的块大小为128位。有不同的方面,可以考察一下。
DES和3DES最适用于最多56位宽(非全长)的整数,因为结果将是一个8字节的单块,因为填充。如果加密一个完整的long值,则会添加一个额外的填充块。
AES将始终为任何长值的int生成一个16字节的密文。
根据this analysis AES(Rijndael-128)的速度是DES / 3DES的两倍多,密钥大小更大(更安全)。当CPU支持AES-NI时,AES甚至比DES或3DES快得多。所有当前的CPU都支持这一点。这是我从openssl speed
命令获取的当前结果。
不要将DES用于任何严重的事情,因为它只有56位密钥(带有奇偶校验的64位密钥)。暴力迫使成本为2 56 。 3DES也不是那么好,因为Brute强制成本是2112。 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模式。随着将通过一个额外的块炸掉密文。
答案 1 :(得分:4)
如果您不需要安全解决方案但只需快速,请考虑XOR cipher:
int key = ...
....
int b = a ^ key;
int c = b ^ key;
assert (c == a);
答案 2 :(得分:1)
如果您想要任何安全性,则不应自行实施密码。有太多可能出错的地方。
但您可以将您的数字写入byte[]
并使用Java提供的密码,如this answer中所述。