2016-04-24 70 views
0

我想用以下格式「AB123456789000」(兩個字母和12位數字)加密/保護輸入字符串,以便可以將安全「版本」作爲長(數字)存儲在數據庫。加密/保護短字符串爲長

我試過RC2加密,但它給了我128位不適合64位長。

+1

二十六位字母,然後12個的4位數超過64位。 –

回答

1

首先,我必須有一點點咆哮。

  1. RC2已過時且不安全(找到加密弱點),請參見Wikipedia。自行承擔使用風險。
  2. 爲什麼不使用好的密碼術?你想要安全,所以只需要用AES加密東西。我不明白所得到的加密長度爲64位的觀點。在Java和C#中,用於加密的標準庫都可以在byte[]上運行,無需將其表示爲long。每個數據庫系統也應該能夠保存二進制blob。

返回將輸入大小降至64位以下。

使用ASCII,您的14個字母的長字符串應該是14個字節(= 112)位,其加密將不適合64位而不進行壓縮。您可以通過說明格式必須是 2個字母,然後是12位數字。爲了進行編碼,你需要用ASCII碼錶示逐字逐字地輸入前兩個字母。這將是2 * 8位= 16位。然後以12位數作爲整數,例如123456789000 = 0x1cbe991a08這是5個字節(= 40位,它適合於long)。這裏最大的數字是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#中編寫編碼和解碼函數來實現此目的。

1

編碼爲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"); 
} 

結果

Ids: AB123456789000 -> 408042270693896 
Ids: AA000000000000 -> 406819302277120 
Ids: AA999999999999 -> 407819302277119 
Ids: ZZ000000000000 -> 1423867557969920 
Ids: ZZ999999999999 -> 1424867557969919