在開發程式的時候,我們可能會需要隱藏敏感的資料,讓一般使用者不會直接看到,例如流水序號、密碼、網頁Cookie等。這樣的資料通常都很小,可能只有數個位元組,但如果使用AES/DES加密,密文(也就是加密後的資料)都至少有16個位元組以上!實在不太適合用來加密這樣的少量資料。



在某些情況下,我們必須或是最好使用短密文。例如網址,人們通常偏好使用比較短的網址,甚至還會去使用「短網址」服務,因為短的網址其識別性更高,看起來更討喜,而且也更容易被傳播。另外就是條碼,條碼的物理空間和資料空間有限,過大的資料量會需要更大的面積來印條碼,因此想辦法減少條碼包含的資料量是很重要的課題。除此之外,需要透過網路傳輸的資料,如網頁Cookie等等,更短的資料量也可以讓傳輸速度變快,減少流量消耗。

ShortCrypt

ShortCrypt是一個跨程式語言的資料加解密函式庫,特點在於其密文只比明文(原始資料)還要大4個位元(半個位元組),非常適合用在需要短密文的條件下。此外,就算要加密的資料只有一位元組的差異,ShortCrypt所加密出來的密文也不會長得很像,不太需要擔心因為密文短就容易被猜出明文。

Rust上使用ShortCrypt

Crates.io

https://crates.io/crates/short-crypt

Cargo.toml

short-crypt = "*"

使用方法

使用「use」關鍵字來將「short-crypt」這個crate底下的「ShortCrypt」結構體給引用到當前的程式範圍下,透過「ShortCrypt」結構體提供的「new」關聯函數,可以從參數傳入要用來加解密的密鑰字串,來建立出「ShortCrypt」結構實體。

加密

有了「ShortCrypt」結構實體之後,就可以使用「encrypt」方法來加密任意資料了!「encrypt」方法可以將透過參數傳入的資料,加密成由一個u8數值和一個Vec<u8>結構實體組成的數組。前者即為那多出來的「4位元」,後者為加密後的資料,其大小等於透過參數傳入至「encrypt」方法的資料。把前後兩者合在一起就是密文了!

例如:

如果要將密文轉成字串,除了可以自己寫程式處理外,可以使用「ShortCrypt」結構實體內建的「encrypt_to_url_component」方法將資料加密成能夠用在URL上的字串,或是用「encrypt_to_qr_code_alphanumeric」方法將資料加密成適合用在QR Code上的字串。

程式如下:

如果想要將字串結果串接到現有的字串之後,可以使用「encrypt_to_url_component_and_push_to_string」或是「encrypt_to_qr_code_alphanumeric_and_push_to_string」方法。

解密

使用「ShortCrypt」結構實體的「decrypt」方法,可以解密從參數傳入的密文。不管明文是不是字串,解密結果都會是Vec<u8>結構實體。

例如:

如果密文是用剛才提過的「encrypt_to_url_component」方法和「encrypt_to_qr_code_alphanumeric」所產生出來的字串的話,則可以用「decrypt_url_component」和「decrypt_qr_code_alphanumeric」方法來解密。

程式如下:

如果要將解密出來的明文,直接串接到現有的Vec<u8>結構實體之後,可以使用「decrypt_url_component_and_push_to_vec」或是「decrypt_qr_code_alphanumeric_and_push_to_vec」方法。

網頁瀏覽器上使用ShortCrypt

網頁瀏覽器上的ShortCrypt函式庫是使用JavaScript來實作的。

GitHub

https://github.com/magiclen/js-short-crypt

使用方法

先將ShortCrypt函式庫的JS檔引用至HTML中,如下:

接著使用「new」關鍵字來實體化出「ShortCrypt」的物件,可以從參數傳入要用來加解密的密鑰字串。

加密

「ShortCrypt」物件有以下幾個與加密相關的方法:

  • encrypt:加密從參數傳入的資料,回傳一個擁有「base」和「body」欄位的物件,這個物件即為密文。
  • encryptToURLComponent:加密從參數傳入的資料,回傳一個能夠用在URL上的字串密文。
  • encryptToQRCodeAlphanumeric:加密從參數傳入的資料,回傳一個適合用在QR Code上的字串密文。

只有字串和Byte陣列可以被加密。

例如:

解密

對應剛才提到的「encrypt」、「encryptToURLComponent」和「encryptToQRCodeAlphanumeric」方法,「ShortCrypt」的物件有提供「decrypt」、「decryptURLComponent」和「decryptQRCodeAlphanumeric」方法,可以解密那些不同形式的密文。

例如: