2

c# で Speck 32/64 ブロック暗号を実装しようとしていますが、暗号化復号化アルゴリズムで立ち往生しています。アルゴリズムに従って、プレーンテキストを2つの単語に分割する必要があることを知っています

x,y = plaintext words
--------------------------- key expansion --------------------------
for i = 0..T-2
[i+m-1] ← (k[i] + S−α
[i]) ⊕ i
k[i+1] ← S
β k[i] ⊕ `[i+m-1]
end for
---------------------------- encryption ----------------------------
for i = 0..T-1
x ← (S−α x + y) ⊕ k[i]
y ← S
βy ⊕ x
end for

参考文献

軽量ブロック暗号の SIMON および SPECK ファミリ https://eprint.iacr.org/2013/404

私の質問は、平文は文字列でなければならないということです。次に、バイナリに変換するか、それを上記のアルゴリズムで使用しますか? アルゴリズムは平文のタイプを示さず、暗号化の例があります

Key: 1918 1110 0908 0100
Plaintext: 6574 694c
Ciphertext: a868 42f2
4

1 に答える 1

1

SPECK 32/64 暗号は、入力として 4 バイトを想定しています。

平文: 6574 694c

意味

byte[] plaintext = new byte[] {0x65, 0x74, 0x69, 0x4C};

0xここで、各バイトは接頭辞を使用して 16 進値として指定されます。

最初のステップで平文を分割します。

byte[] x = new byte[] {plaintext[0], plaintext[1]};
byte[] y = new byte[] {plaintext[2], plaintext[3]};

注:より巧妙な配列操作を使用して暗号を高速化してください。上記の例は教育目的のみです。

注 2 : 入力を a として処理するuintのは良い方法かもしれません。少しビット単位の魔法を使用すると、配列よりもはるかに高速になる可能性があります。

uint plaintext = 0x6574694C;
ushort x = (ushort) (plaintext >> 16);
ushort y = (ushort) plaintext;
于 2015-12-22T12:09:29.240 に答える