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のアルゴリズムは以下の通りです.
    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