Java 将短字符串加密/保护为长字符串
我想用以下格式“AB123456789000”(两个字母和12位数字)加密/保护输入字符串,以便安全的“版本”可以在数据库中存储为长(数字)Java 将短字符串加密/保护为长字符串,java,c#,encryption,encoding,rc2-cipher,Java,C#,Encryption,Encoding,Rc2 Cipher,我想用以下格式“AB123456789000”(两个字母和12位数字)加密/保护输入字符串,以便安全的“版本”可以在数据库中存储为长(数字) 我尝试过RC2加密,但它给了我128位,这不适合64位的长度。首先,我必须有一点经验 RC2已过时且不安全(发现密码漏洞),请参阅。风险自负 为什么不使用好的加密技术?你想要一些安全的东西,比如用AES加密东西。我不理解这样的论点,即最终的加密必须是64位长的。在Java和C中,用于加密的标准库都使用字节[],无需将其表示为一个长的。每个数据库系统也应该能
我尝试过RC2加密,但它给了我128位,这不适合64位的长度。首先,我必须有一点经验
字节[]
,无需将其表示为一个长的。每个数据库系统也应该能够保存二进制blob
123456789000=0x1cbe991a08
,它是5个字节(=40位,适合长
)。此处最大的可能数字是9999999999
,即0xe8d4a50fff
,因此所有内容仍可以保存在5个字节内
总的来说,我们将有2*8位+5*8位=56位,这足够小,适合于一个RC2加密块,即64位。您可以将最后一个字节设置为0x00
因此,简而言之,明文编码版本的2个字节将代表这两个字母的ASCII值,接下来的5个字节将是一个long
的数字
比如说,,
AB123456789000
将被编码为0x41421cbe991a08
('A'=0x41,B=0x42
,然后123456789000=0x1cbe991a08
)。您可以用Java和C语言编写编码和解码函数来实现这一点。首先,我必须有一点经验
字节[]
,无需将其表示为一个长的。每个数据库系统也应该能够保存二进制blob
123456789000=0x1cbe991a08
,它是5个字节(=40位,适合长
)。此处最大的可能数字是9999999999
,即0xe8d4a50fff
,因此所有内容仍可以保存在5个字节内
总的来说,我们将有2*8位+5*8位=56位,这足够小,适合于一个RC2加密块,即64位。您可以将最后一个字节设置为0x00
因此,简而言之,明文编码版本的2个字节将代表这两个字母的ASCII值,接下来的5个字节将是一个long
的数字
比如说,,
AB123456789000
将被编码为0x41421cbe991a08
('A'=0x41,B=0x42
,然后123456789000=0x1cbe991a08
)。您可以用Java和C编写编码和解码函数来实现这一点。编码到64位非常简单:
public static long toId(String id) {
long numPart = Long.parseLong(id.substring(2));
long letterPart = Long.parseLong(id.substring(0, 2), 36);
long res = (letterPart << 40) | numPart;
System.out.println("Ids: " + id + " -> " + res);
return res;
}
public static void main(String[] args) {
toId("AB123456789000");
toId("AA000000000000");
toId("AA999999999999");
toId("ZZ000000000000");
toId("ZZ999999999999");
}
编码到64位非常简单:
public static long toId(String id) {
long numPart = Long.parseLong(id.substring(2));
long letterPart = Long.parseLong(id.substring(0, 2), 36);
long res = (letterPart << 40) | numPart;
System.out.println("Ids: " + id + " -> " + res);
return res;
}
public static void main(String[] args) {
toId("AB123456789000");
toId("AA000000000000");
toId("AA999999999999");
toId("ZZ000000000000");
toId("ZZ999999999999");
}
两个16位字母和12个4位数字大于64位。两个16位字母和12个4位数字大于64位。