java - 从给定的数字字符串生成 16 位唯一的十六进制值

标签 java encryption md5 sha

我该如何去做呢?我尝试使用 SHA-1 和 MD5,但输出对于我的要求来说太长,并且截断不会使其变得唯一。

输入:包含数字的字符串,例如(0302160123456789)

收到的输出:30f2bddc3e2fba9c05d97d04f8da4449

所需输出:范围内的唯一数字 (0000000000000000 - FFFFFFFFFFFFFFFF) 且长度为 16 个字符

非常感谢任何帮助/指示。

最佳答案

您的输入域有多大?如果它大于您的输出域,则 Pigeon Hole principle 适用,并且您无法根据定义获得唯一的输出。

如果输入域小于或等于输出域,那么您可以使用分组密码提供的 Pseudo-Random Permutation (PRP) 轻松完成此操作。

16个十六进制的输出相当于8个字节,相当于64位。 DES(和三重 DES)是具有此 block 大小的 block 密码。

  1. 以紧凑的方式将输入字符串解析为字节数组。如果输入始终由数字组成,您可以使用 Ebbe M. Pedersen 的方法

    byte[] plaintext = new BigInteger("0302160123456789").toByteArray();
    
  2. 然后您可以为 Triple DES 生成一些随机但固定的 24 字节 key ,并使用以下方法实例化密码:

    Cipher c = Cipher.getInstance("DESede/ECB/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DESede"));
    byte[] ciphertext = c.doFinal(plaintext);
    
  3. 使用某种十六进制转换器来获取您想要的表示形式。

您可以使用此“散列”最多 36028797018963968 的数字。如果您想要更大的数字(最多 9223372036854775808),那么您需要使用 "DESede/ECB/NoPadding" 并用一些填充字节填充自己。

关于java - 从给定的数字字符串生成 16 位唯一的十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35760176/

相关文章:

java - 使用 Java 代码中的不同引号执行 Bash 单行代码以进行 Elasticsearch 查询

c# - 使用命令 aspnet_regiis.exe 加密 web.config

javax.crypto.IllegalBlockSizeException : Input length must be multiple of 16 when decrypting with padded cipher

ios - 更新到 Xcode 8.3 后, Realm 浏览器要求提供加密 key

php - 使用 PHP 和 CURL 计算正在下载的文件的 MD5

java - 何时清理ReferenceQueue?被系统清理了?

java - 如何为 SOAP 请求生成 UsernameToken?

mysql - 什么会影响 MySQL 中的 MD5 函数结果?

php - 如果使用中文字符,为什么 php md5() 总是与 python 的 hash.md5() 不同?

java - 计分游戏无法正常执行