如何使用密码和Java加密/解密12位十进制数到其他十进制数?

Kan*_*ath 1 java encryption

我已经阅读了使用Java来加密整数使用DES使用Pass Phrase加密.

我需要的只是一个简单的加密器,它将12位数字转换为12位数字,具有以下约束:

  1. 加密必须依赖于密码(在应用程序的整个生命周期内都是不变的),而不是其他任何密码.
  2. 映射必须为1-1(无散列和多个输入给出相同的输出,反之亦然).
  3. 映射不能在不同的VM之间更改,或者在启动VM时(例如,当您重新启动Java时,该实用程序应该为您提供相同的映射,这意味着它必须完全依赖于提供的密码).
  4. 以0开头的数字不是有效的12位数字(输入数字也不会以0开头).
  5. 密钥/密码永远不应该是可猜测的.例如,运行具有多个输入的实用程序并分析输出不应该允许人们猜测键/ pwd/hash或其他.
  6. 所有输入将精确地为12位且小于12位数的素数(这意味着我们可以使用模运算).

通过文献搜索我有这个代码与我

public void mytestSimple(long code, String password) throws Exception {
    SecretKey key = new SecretKeySpec(password.getBytes(), "DES");
    Cipher ecipher = Cipher.getInstance("DES");
    ecipher.init(Cipher.ENCRYPT_MODE, key);
    System.out.println(ecipher.getOutputSize(8));

    byte[] encrypted = ecipher.doFinal(numberToBytes(code));
    System.out.println(encrypted + "--" + encrypted.length);

    Cipher dcipher = Cipher.getInstance("DES");
    dcipher.init(Cipher.DECRYPT_MODE, key);
    byte[] decrypted = dcipher.doFinal(encrypted);
    System.out.println(bytesToNumber(decrypted) + "--" + decrypted.length);
}

public void testSimple() throws Exception {
    mytestSimple(981762654986L, "password");
}
Run Code Online (Sandbox Code Playgroud)

我遇到了问题

  1. 如何将16个字节转换为12位数字.
  2. 保持1-1映射.
  3. 在多个VM调用中保持加密/解密相同.

****我在下面添加的答案****

我添加了一个答案,即从标准Ja​​va RSA密钥对逻辑中提取的40位RSA.我仍然需要研究边缘情况.我将接受答案并提出"Tadmas",我认为有点引导我回答.有人能告诉我我的算法是否会变弱/可攻击吗?

Jon*_*eet 6

您无法在不丢失信息的情况下将16个字节转换为12位数字.256 ^ 16> 10 ^ 12.(并不是说你甚至有10 ^ 12个选项,因为你只有[100000000000,999999999999].

我怀疑你能否使用任何传统的加密库,因为你的要求有些奇怪.


Tad*_*mas 6

如果严格的1:1映射比防止密码分析更重要,那么您可以将密码转换为12位数字(通过哈希或其他方式)并简单地添加到原始数字mod 10 ^ 12.如果你绝对必须从输出中删除前导零,你可以减去10 ^ 11,做数学模型(10 ^ 12 - 10 ^ 11),然后再添加10 ^ 11.当然,这是非常不安全的,但它很简单.:)

如果输入范围受小于(10 ^ 12 - 10 ^ 11)的素数限制,您可以使用message ^ password mod prime来形成一个满足您要求的环并且更难以破解.(这与RSA的工作原理类似.)我认为如果您不需要解密它,这可能会有效.

我同意Jon Skeet:要求严格的1:1映射,而输出范围不大于输入域,这是大多数加密库无法处理的.