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

And*_*rea 4 java encryption encryption-symmetric

Java中具有这些属性的整数加密密码功能是什么?:

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

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

Art*_* B. 5

没有外部库的要求将列表减少到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命令中获取的当前结果。

AES的16字节有效负载达到127MB / s,而3DES仅达到27MB / s。是要四处查看的数据。

安全

不要将DES用于任何严重的事情,因为它只有56位密钥(奇偶校验为64位)。暴力破解成本为2 56。3DES也不是那么好,因为暴力破解的成本是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();
}
Run Code Online (Sandbox Code Playgroud)

操作模式

在这里,我使用ECB模式。通常,使用它不是一个好主意。有一个问题,即用相同的密钥对相同的明文进行加密会得到相同的密文。这可能不是可接受的属性。如果不可接受,则需要使用带有新随机IV的CBC模式。使用将会使密文增加一个额外的块。


Kon*_*lov 5

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

int key = ...
....
int b = a ^ key;
int c = b ^ key;
assert (c == a);
Run Code Online (Sandbox Code Playgroud)

  • 如果密钥是随机生成的、大于消息并且在其生命周期内仅使用一次,那么 XOR 可能是最安全的选项。如果多次使用该密钥,您将获得一个多次密码本,可以在其中推断出原始值。 (3认同)