CryptoPals Crypto Challenges Using Rust: 16 進数を base64 に変換する


これは、Rust 言語を使用して実装された Challenge 1 の課題の CryptoPals です.

環境



非常に単純です.16 進文字列が与えられ、それを base64 エンコード形式に変換する必要があります.基本的に、あるエンコーディングから別のエンコーディングへ.

16 進エンコード



Hex は、0 ~ 9 および A ~ F の 16 個のシンボルを使用する base 16 形式です.各 16 進数 (つまり、0 ~ 9 & A ~ F) は、4 ビットを使用して表す (または対応する) ことができます.なぜ4ビット? 4ビットを使用すると、2 ^ 4(= 16)の組み合わせが可能になるためです.したがって、 0000 (binary) = 0 (hex)1111 (binary) = F (hex) .したがって、2 桁の 16 進数には 4 ビットが必要です.したがって、 0010 1101 (binary) = 2D です. 16 進エンコーディングでは、小文字と大文字の間に違いはなく、どちらも同じ意味であることに注意してください (base64 とは異なります).

では、ASCII のテキストを 16 進数に変換する方法について話しましょう.各 ASCII 文字は 1 バイトまたは 8 ビットのサイズです.したがって、各 ASCII 文字を表すには 2 桁の 16 進数が必要です.したがって、Z (ASCII テキスト内) は 16 進数では 5A であり、0 (数値ではなく ASCII テキスト内で!) は実際には 16 進数形式で 30 です!詳しくは here をご覧ください.

Base64 エンコーディング



同様に、Base64 は、64 個のシンボル (0 から 9、A から Z、a から z、+ および/) を使用する base 64 (当たり前!) エンコーディングです. = chars がエンコーディング出力の最後に表示される場合もありますが、base64 の = は、出力の長さを 4 の倍数に正規化するために出力に適用される単なるパディングです.上記の 16 進エンコーディングと同様のロジックを使用すると、base64 の各桁が表すことがわかります. 6 ビットのデータ (2^6 = 64).

理論的には、16 進数を base64 に変換するには、最初に 16 進数を 2 進数に変換して長いビット列 (1 と 0) を作成し、ビットを 6 ビット チャンクに分割してから、これらの 6 ビット チャンクを対応する base64 数字に変換します.

ただし、Rust を使用しているため、hex と base64 を操作するために 2 つの素敵なクレート ( hexbase64 ) を使用することで簡素化できます.
  • まず、入力 16 進文字列を hex::decode() を使用して raw バイトに変換します.

  • using hex;
    
    let bytes = hex::decode(input_hex).unwrap();
    


  • base64::encode() を使用して、これらのバイトを base64 にエンコードします.

  • using base64;
    
    let output = base64::encode(bytes);
    


    そして、base64 output があります!

    これを素敵な関数にカプセル化できます.

    use base64;
    use hex;
    
    pub fn convert_hex_to_base64(hex: &str) -> String {
        base64::encode(hex::decode(hex).unwrap())
    }
    


    これです!

    Github のコードを参照してください.

    私を見つける:
    ツイッター -

    naveeen.com