我想用以下格式「AB123456789000」(兩個字母和12位數字)加密/保護輸入字符串,以便可以將安全「版本」作爲長(數字)存儲在數據庫。加密/保護短字符串爲長
我試過RC2加密,但它給了我128位不適合64位長。
我想用以下格式「AB123456789000」(兩個字母和12位數字)加密/保護輸入字符串,以便可以將安全「版本」作爲長(數字)存儲在數據庫。加密/保護短字符串爲長
我試過RC2加密,但它給了我128位不適合64位長。
首先,我必須有一點點咆哮。
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#中編寫編碼和解碼函數來實現此目的。
編碼爲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
二十六位字母,然後12個的4位數超過64位。 –