Java 将短字符串加密/保护为长字符串

Java 将短字符串加密/保护为长字符串,java,c#,encryption,encoding,rc2-cipher,Java,C#,Encryption,Encoding,Rc2 Cipher,我想用以下格式“AB123456789000”(两个字母和12位数字)加密/保护输入字符串,以便安全的“版本”可以在数据库中存储为长(数字) 我尝试过RC2加密,但它给了我128位,这不适合64位的长度。首先,我必须有一点经验 RC2已过时且不安全(发现密码漏洞),请参阅。风险自负 为什么不使用好的加密技术?你想要一些安全的东西,比如用AES加密东西。我不理解这样的论点,即最终的加密必须是64位长的。在Java和C中,用于加密的标准库都使用字节[],无需将其表示为一个长的。每个数据库系统也应该能

我想用以下格式“AB123456789000”(两个字母和12位数字)加密/保护输入字符串,以便安全的“版本”可以在数据库中存储为长(数字)


我尝试过RC2加密,但它给了我128位,这不适合64位的长度。

首先,我必须有一点经验

  • RC2已过时且不安全(发现密码漏洞),请参阅。风险自负
  • 为什么不使用好的加密技术?你想要一些安全的东西,比如用AES加密东西。我不理解这样的论点,即最终的加密必须是64位长的。在Java和C中,用于加密的标准库都使用
    字节[]
    ,无需将其表示为一个
    长的
    。每个数据库系统也应该能够保存二进制blob
  • 回到将输入大小降低到64位以下

    使用ASCII,14个字母长的字符串将是14字节(=112)位,如果不进行压缩,它的加密将不适合64位。你可以说的格式必须是两个字母,然后是12位数字,以此来作弊。对于编码,您需要以ASCII表示形式逐字记录前两个字母。这将是2*8位=16位。然后将12位数字作为一个整数,例如
    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语言编写编码和解码函数来实现这一点。

    首先,我必须有一点经验

  • RC2已过时且不安全(发现密码漏洞),请参阅。风险自负
  • 为什么不使用好的加密技术?你想要一些安全的东西,比如用AES加密东西。我不理解这样的论点,即最终的加密必须是64位长的。在Java和C中,用于加密的标准库都使用
    字节[]
    ,无需将其表示为一个
    长的
    。每个数据库系统也应该能够保存二进制blob
  • 回到将输入大小降低到64位以下

    使用ASCII,14个字母长的字符串将是14字节(=112)位,如果不进行压缩,它的加密将不适合64位。你可以说的格式必须是两个字母,然后是12位数字,以此来作弊。对于编码,您需要以ASCII表示形式逐字记录前两个字母。这将是2*8位=16位。然后将12位数字作为一个整数,例如
    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位。