RC 4アルゴリズムを書き換え、新しい暗号化アルゴリズムRCX.
4056 ワード
最近JWTアルゴリズムを研究して、JWTはheader、payload、signatureの3つの部分から構成して、payloadは非暗号化で、いくつかの敏感な情報は他の人に不法に獲得することができて、必要な時暗号化します.
暗号化アルゴリズムでは,RC 4アルゴリズムの速度はDES暗号化の10倍程度に達し,高いレベルの非線形性を有する.RC 4アルゴリズム暗号化はxorを用いているため,サブ鍵シーケンスが重複すると暗号文が解読される可能性がある.jwtのpayloadはjson形式なので解読されやすい.
数日のRC 4アルゴリズムの研究を経て、やっと性能の良いアルゴリズムを書きました.IPHONEXの熱に乗じて、RCXアルゴリズムと言います.
暗号化の例:
鍵(secret key):ToolGood出力データ型(output data type):Base 64_Url
RC4('ABCDDDDDDDDDDDDDDDDDDDDDD') => O8AF0I3sAzyQaTO78S9irZwDfemUR4eGsw
RC4('ACBDDDDDDDDDDDDDDDDDDDDDD') => O8EE0I3sAzyQaTO78S9irZwDfemUR4eGsw
RC4('CBADDDDDDDDDDDDDDDDDDDDDD') => OcAH0I3sAzyQaTO78S9irZwDfemUR4eGsw
RC4('1234567891234567891234567') => S7B1oPyecEDtHEXMgV4Q3uB-CJ_jN_b0wA
RC4('1234567800034567891234567') => S7B1oPyecEDkHUfMgV4Q3uB-CJ_jN_b0wA
RCX('ABCDDDDDDDDDDDDDDDDDDDDDD') => O3priO83Pd4e-7IeTBJmrIax7kmO5yzr2Q
RCX('ACBDDDDDDDDDDDDDDDDDDDDDD') => O3s81pEyp9daRW9yHYC4ynIOalk8FYSI9g
RCX('CBADDDDDDDDDDDDDDDDDDDDDD') => OXpp1Sm4eyyhg5MQGWrjGa6w2MZhoK09Kw
RCX('1234567891234567891234567') => SwoWZFa8uiJnqv_arFs0WVHOfYRvMGTsAw
RCX('1234567800034567891234567') => SwoWZFa8uiJuQXjGVkKaspQseRHK9qtVZA
上記のコードから、RC 4アルゴリズムの欠点が明らかになり、RCXアルゴリズムによりデータが暗号化されて無秩序になる.
RCXのアルゴリズムは以下の通りです.
コード解析:
RC 4はiとjを用いて暗号盤を入れ替える.
RCXは[明文]と[密文]を用いて交換し、jを修正する.
パフォーマンス:
鍵(secret key):ToolGoodデータ長(data length):10000暗号化回数(encryption count):1000 RC 4=>150 msRCX=>255 ms
元のコード:https://github.com/toolgood/RCX
暗号化アルゴリズムでは,RC 4アルゴリズムの速度はDES暗号化の10倍程度に達し,高いレベルの非線形性を有する.RC 4アルゴリズム暗号化はxorを用いているため,サブ鍵シーケンスが重複すると暗号文が解読される可能性がある.jwtのpayloadはjson形式なので解読されやすい.
数日のRC 4アルゴリズムの研究を経て、やっと性能の良いアルゴリズムを書きました.IPHONEXの熱に乗じて、RCXアルゴリズムと言います.
暗号化の例:
鍵(secret key):ToolGood出力データ型(output data type):Base 64_Url
RC4('ABCDDDDDDDDDDDDDDDDDDDDDD') => O8AF0I3sAzyQaTO78S9irZwDfemUR4eGsw
RC4('ACBDDDDDDDDDDDDDDDDDDDDDD') => O8EE0I3sAzyQaTO78S9irZwDfemUR4eGsw
RC4('CBADDDDDDDDDDDDDDDDDDDDDD') => OcAH0I3sAzyQaTO78S9irZwDfemUR4eGsw
RC4('1234567891234567891234567') => S7B1oPyecEDtHEXMgV4Q3uB-CJ_jN_b0wA
RC4('1234567800034567891234567') => S7B1oPyecEDkHUfMgV4Q3uB-CJ_jN_b0wA
RCX('ABCDDDDDDDDDDDDDDDDDDDDDD') => O3priO83Pd4e-7IeTBJmrIax7kmO5yzr2Q
RCX('ACBDDDDDDDDDDDDDDDDDDDDDD') => O3s81pEyp9daRW9yHYC4ynIOalk8FYSI9g
RCX('CBADDDDDDDDDDDDDDDDDDDDDD') => OXpp1Sm4eyyhg5MQGWrjGa6w2MZhoK09Kw
RCX('1234567891234567891234567') => SwoWZFa8uiJnqv_arFs0WVHOfYRvMGTsAw
RCX('1234567800034567891234567') => SwoWZFa8uiJuQXjGVkKaspQseRHK9qtVZA
上記のコードから、RC 4アルゴリズムの欠点が明らかになり、RCXアルゴリズムによりデータが暗号化されて無秩序になる.
RCXのアルゴリズムは以下の通りです.
public class RCX
{
private const int keyLen = 256;
///
/// Encrypt
///
///
///
///
public static byte[] Encrypt(byte[] data, byte[] pass)
{
if (data == null) throw new ArgumentNullException("data");
if (pass == null) throw new ArgumentNullException("pass");
byte[] mBox = GetKey(pass, keyLen);
byte[] output = new byte[data.Length];
int i = 0, j = 0;
for (int offset = 0; offset < data.Length; offset++) {
i = (++i) & 0xFF;
j = (j + mBox[i]) & 0xFF;
byte a = data[offset];
byte c = (byte)(a ^ mBox[(mBox[i] + mBox[j]) & 0xFF]);
output[offset] = c;
byte temp2 = mBox[c];
mBox[c] = mBox[a];
mBox[a] = temp2;
j = (j + a + c);
}
return output;
}
///
/// Encrypt
///
///
///
///
public static byte[] Encrypt(byte[] data, string pass)
{
if (data == null) throw new ArgumentNullException("data");
if (pass == null) throw new ArgumentNullException("pass");
return Encrypt(data, Encoding.Unicode.GetBytes(pass));
}
private static byte[] GetKey(byte[] pass, int kLen)
{
byte[] mBox = new byte[kLen];
for (Int64 i = 0; i < kLen; i++) {
mBox[i] = (byte)i;
}
Int64 j = 0;
for (Int64 i = 0; i < kLen; i++) {
j = (j + mBox[i] + pass[i % pass.Length]) % kLen;
byte temp = mBox[i];
mBox[i] = mBox[j];
mBox[j] = temp;
}
return mBox;
}
}
コード解析:
RC 4はiとjを用いて暗号盤を入れ替える.
RCXは[明文]と[密文]を用いて交換し、jを修正する.
パフォーマンス:
鍵(secret key):ToolGoodデータ長(data length):10000暗号化回数(encryption count):1000 RC 4=>150 msRCX=>255 ms
元のコード:https://github.com/toolgood/RCX