RC 4暗号化アルゴリズムの実践

5689 ワード

暗号化アルゴリズムの説明
暗号化は実はそんなに神秘的ではありません.試みた後、暗号化を適用するのも簡単です.
_; 暗号化アルゴリズムの種類:
  • 対称暗号化:暗号解読鍵は同じである.
  • 非対称暗号化:暗号解読は異なる鍵を使用する.
  • _; 共通暗号化アルゴリズム:
  • RC 4:対称アルゴリズム、可変長鍵、大量のデータの暗号化、速度が速く、明文の長さが異なる.
  • DEC:対称アルゴリズム、速度が速く、大量のデータを暗号化する.
  • IDEA:対称アルゴリズム、128ビット鍵.
  • RSA:非対称アルゴリズム、公開鍵+鍵.
  • RC 4暗号化アルゴリズムの実践
    RC 4暗号化アルゴリズムに対して、鍵長が128ビットに達すると、暴力解読は基本的に難しくなります.以下はC++の実装です.
    encryptdecode.h
    
    #ifndef __ENCRYPTDECODE_H__
    #define __ENCRYPTDECODE_H__
    
    
    #include
    #include
    
    
    class EncryptDecode{
    
    private:
        void encrypt_decode_init(unsigned char *s,char *key,unsigned int keyLen);
        void encrypt_decode(unsigned char *s,unsigned char*Data,unsigned long textLen);
    };
    #endif
    encryptdecode.cpp
    
    #include "EncryptDecode.h"
    
    void EncryptDecode::encrypt_decode_init(unsigned char*s,char*key,unsigned int keyLen)
    {
        int i=0,j=0;
        char k[256]={0};
        unsigned char tmp=0;
        for(i=0;i<256;i++)
        {
            s[i]=i;
            k[i]=key[i%keyLen];
        }
        for(i=0;i<256;i++)
        {
            j=(j+s[i]+k[i])%256;
            tmp=s[i];
            s[i]=s[j];
            s[j]=tmp;
        }
    }
    
    void EncryptDecode::encrypt_decode(unsigned char*s,unsigned char*Data,unsigned long textLen)
    {
        int i=0,j=0,t=0;
        unsigned long k=0;
        unsigned char tmp;
        for(k=0;k1)%256;
            j=(j+s[i])%256;
            tmp=s[i];
            s[i]=s[j];
            s[j]=tmp;        
            t=(s[i]+s[j])%256;
            Data[k] ^= s[t];
        }
    }
    main.cpp
    
    #include "encryptdecode.h"
    #include 
    
    int main(int argc, char *argv[])
    {
        unsigned char s_box[256] = "";
        unsigned char buf[512] = "    RC4        ";
        char key[256] = "";
    
        int keylen = strlen(key);
    
        //  
        encrypt_decode_init(s_box,key,keylen);
        encrypt_decode(s_box,buf,strlen(buf));
        printf("Encrypt:%s
    "
    ,buf); // (s_box , s_box) encrypt_decode_init(s_box,key,keylen); encrypt_decode(s_box,buf,strlen(buf)); printf("Decode:%s
    "
    ,buf); return 0; }
    説明
  • は異なる長さの平文を暗号化すると、この明文を復号する際に、この明文の長さを取得する必要があります.そうでなければ復号できません.
  • s_boxを暗号化したら元の内容ではなく、暗号化する前にs_を保存できます.boxの内容は、または再初期化され、解読に成功します.
  • は、暗号化の成功に影響を与える要素の長さを知ることができ、例えば、1つのファイルを暗号化し、3つのセグメントに分割し、各セグメントのコンテンツの長さが異なる場合、その3つの文の長さを順次知る必要がある.また、鍵の長さと内容は復号に影響を及ぼします.