当前位置: 首页 > 面试题库 >

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

端木兴国
2023-03-14
问题内容

我已经读过《使用Java加密整数》和《使用通行短语用DES加密》。

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

  1. 加密必须依赖于密码(在应用程序的整个生命周期中保持不变),而不能依赖其他任何密码。
  2. 映射必须为1-1(无哈希且多个输入具有相同的输出,反之亦然)。
  3. 映射不得在不同的VM之间或启动VM时更改(例如,当您重新启动Java时,该实用程序应为您提供相同的映射,这意味着它必须完全取决于所提供的密码)。
  4. 以0开头的数字不是有效的12位数字(输入的数字也不会以0开头)。
  5. 密钥/密码永远不可猜测。例如,运行具有多个输入的实用程序并分析输出,不应让人们猜测密钥/密码/哈希或其他内容。
  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");
}

我遇到了关于

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

*我在下面添加的答案*

我添加了一个答案,即从标准Ja​​va RSA密钥对生成逻辑中抽出的40位RSA。我仍然需要处理极端情况。我将接受答案并投票赞成“
Tadmas”,我认为这会引导我找到答案。有人可以告诉我我的算法是否很弱/容易受到攻击吗?


问题答案:

我认为Tadmas下面给出的答案非常有帮助,我希望你们在下面破解/欺负我的实现。正如Tadmas指出的,我所有的数字都是40位(12位数字是10 ^
12,大约是2 ^ 40)。

我复制了sun.security.rsa.RSAKeyPairGenerator(链接),并为40位RSA算法创建了自己的生成器。标准之一需要512-1024位,因此我删除了它周围的输入检查。一旦我创建了一个合适的n,e,d值(按照alog,e似乎是65537)。以下代码很好用,

public void testSimple() throws NoSuchAlgorithmException {
    MyKeyPairGenerator x = new MyKeyPairGenerator();
    x.initialize(40, new SecureRandom("password".getBytes()));

    MyPublicPrivateKey keypair = x.generateKeyPair();
    System.out.println(keypair);

    BigInteger message = new BigInteger("167890871234");
    BigInteger encoded = message.modPow(keypair.e, keypair.n);
    System.out.println(encoded); //gives some encoded value
    BigInteger decoded = encoded.modPow(keypair.d, keypair.n);
    System.out.println(decoded); //gives back original value
}

缺点

  1. 编码的不一定是12位数字(有时可能以0开头,这意味着只有11位数字)。我想总是在前面填充0零,并在开头添加一些CHECKSUM数字,这可以缓解此问题。所以总是13位数…
  2. 40位RSA的安全性比512位弱(不仅是512/40倍,而且是指数倍)。您能为我指出40位RSA与512位RSA相比有多安全的链接吗(我可以在Wiki中看到某些内容,但无法具体确认受到攻击的可能性)?关于概率/破解N的函数所需的RSA尝试次数/概率的任何链接(wiki?)(其中n是所使用的位数)将非常棒!


 类似资料:
  • 问题内容: 我想用Java加密和解密密码,然后以加密形式存储到数据库中。如果它是开源的,那就太好了。有什么建议/建议吗? 问题答案: 编辑 :这个答案是旧的。现在 不建议 使用MD5,因为它很容易被破坏。 我想象中的MD5必须足够好?您可以使用MessageDigest实现它。 这里还列出了其他算法。 如果确实需要,这是它的第三方版本: Fast MD5

  • 问题内容: 我正在使用ExtJS框架。我在 JavaScript中 有MD5函数来加密某些JSON。我的后端使用Java,所以我想知道如何使用 Java 解密MD5 Javascript加密? 这是我正在使用的MD5函数的JS等效项: 问题答案: MD5是 哈希 (即单向转换),因此您无法对其进行解密。您可以将已知哈希与从明文计算出的哈希进行比较,以验证输入的有效性。Java已经为此内置了库。我在

  • 我想得到的是 使用libnail加密密码salt 我有一个列表的盐,我想用它来加密/解密我的密码。当我加密密码时,我得到一个哈希返回,这样一个似乎可以工作,但在解密时,我总是得到假返回值。 我是否使用了错误的方法对libnaude进行加密/解密,还是完全朝着错误的方向行驶? 我的加密/解密源: 我感谢任何帮助! 多姆

  • 问题内容: 这是我正在做的事情,可能看起来有些笨拙,但是可以帮助您解决该问题。我得到一个。阅读几乎所有相关主题,但找不到合适的解决方案。我是加密解密程序设计的新手,需要在我的Java应用程序之一中实现它。 谢谢..这就是代码的样子.... 问题答案: 在这里,您需要了解的是密文可能包含不可打印的字符。因此,当您使用readLine()时,它可能不会为您提供文件中的所有字节。 同样,它并没有给您您认

  • 问题内容: 在数据访问层中具有Spring&Hibernate(JPA)的Java应用程序堆栈中,有什么好的方法来应用密码加密(希望使用注释),以及在哪里可以找到更多有关完成密码的方法(教程等)? 可以理解,我将使用JCA支持的算法对密码进行加密,但是如果有一种简便的方法,我宁愿不必实现包装逻辑。 我正在查看Jasypt,并且是a)想知道这是否是一个不错的选择以及如何做到这一点,以及b)人们还在为

  • 问题内容: 我是密码学的新手。我希望学习如何在文件中加密和解密文本……当我在net中引用相关文章时。我怀疑对同一文本进行多次加密后,单个文本的加密文本是否会相同?谁能解决我的疑问? 问题答案: 这是使用该类的示例: