java - 在 Java 中快速、简单地使用对称密码进行整数加密

标签 java encryption encryption-symmetric

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

  • 对称 key 算法
  • 使用简单(即只需几行代码即可使用,无需包含外部库)
  • 可以指定输出长度(例如20个字符)

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

最佳答案

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

密文大小

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

AES 总是会为任何 long 值的 int 生成一个 16 字节的密文。

速度

根据 this analysis AES (Rijndael-128) 的速度是 DES/3DES 的两倍多,但 key 大小更大(更安全)。当 CPU 支持 AES-NI 时,AES 甚至可以比 DES 或 3DES 快得多。目前所有的 CPU 都支持这个。这是我从 openssl speed 命令获取的当前结果。

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

安全

不要将 DES 用于任何严肃的事情,因为它只有一个 56 位 key (64 位奇偶校验)。暴力破解成本为 256。 3DES 也不是很好,因为暴力破解成本是 2112 . AES 的暴力破解成本为 2128、2192、2256,具体取决于使用的 key 大小。

代码

可能使用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模式。使用它通常不是一个好主意。它有一个问题,即用相同的 key 加密相同的明文会得到相同的密文。这可能不是可接受的属性。如果 Not Acceptable ,那么您需要使用例如带有新随机 IV 的 CBC 模式。 With 会将密文炸毁一个额外的 block 。

关于java - 在 Java 中快速、简单地使用对称密码进行整数加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29880062/

相关文章:

Java 语法突出显示和代码建议对某些文件停止工作

java - 在 JavaFX 2.0 中将标签置于节点的中心

sql-server-2008 - 存储 TOTP 的 key

python - 我的 python 加密软件不工作

perl - 使用对称加密的Perl中的安全非篡改URL组件?

java - Android 函数转AsyncTask

java - 集合中的 Hibernate 集合

database - 数据库级加密中的数据泄漏

c# - 加解密出错,找不到异常原因

c# - 生成 AES 256 位 key 值