AES加密算法的C++实现过程

时间:2024.3.31

//AES.H

#ifndef _AES_H_

#define _AES_H_

#include "stdafx.h"

#define AES_KEY_ROW_NUMBER 4

#define AES_KEY_COLUMN_NUMBER 4

#define AES_ROUND_COUNT 10

class AES : public Encryption

{

public:

    AES(void);

    AES(BYTE* key);

    virtual ~AES(void);

    void Encrypt(BYTE *, BYTE *,size_t);

    void Decrypt(BYTE *, BYTE *,size_t);

private:

    BYTE swapbox[11][4][4];

   

    BYTE* Cipher(BYTE* input);

    BYTE* InvCipher(BYTE* input);

    BYTE* Cipher(void * input, size_t length);

    BYTE* InvCipher(void * input, size_t length);  

    void KeyExpansion(BYTE* key, BYTE w[][4][AES_KEY_COLUMN_NUMBER]);

    BYTE FFmul(BYTE a, BYTE b);

    void SubBytes(BYTE state[][AES_KEY_COLUMN_NUMBER]);

    void ShiftRows(BYTE state[][AES_KEY_COLUMN_NUMBER]);

    void MixColumns(BYTE state[][AES_KEY_COLUMN_NUMBER]);

    void AddRoundKey(BYTE state[][AES_KEY_COLUMN_NUMBER], BYTE k[][AES_KEY_COLUMN_NUMBER]);

    void InvSubBytes(BYTE state[][AES_KEY_COLUMN_NUMBER]);

    void InvShiftRows(BYTE state[][AES_KEY_COLUMN_NUMBER]);

    void InvMixColumns(BYTE state[][AES_KEY_COLUMN_NUMBER]);

};

#endif // _AES_H_

//Encryption.h

#ifndef _ENCRYPTION_H_

#define _ENCRYPTION_H_

#include "stdafx.h"

class Encryption

{

public:

   

    virtual void Encrypt(BYTE *, BYTE *,size_t) = 0;

    virtual void Decrypt(BYTE *, BYTE *,size_t) = 0;

};

#endif

//EncryptionFactory.h

#ifndef _ENCRYPTION_FACTORY_H_

#define _ENCRYPTION_FACTORY_H_

#include "Encryption.h"

#include "stdafx.h"

class EncryptionFactory

{

public:

    EncryptionFactory(void);

    virtual ~EncryptionFactory(void);

    static Encryption* getEncryption(int encryptionType,BYTE* key);

private :

    static Encryption* encry;

};

#endif

//AES.cpp

#include "stdafx.h"

#include "AES.h"

#include <stdlib.h>

#include <memory.h>

//permutebox

static unsigned  char permutebox[] =

    { /*  0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f */

        0x63,0x7c,0x77,0x7b,0xf2,0x6b,0x6f,0xc5,0x30,0x01,0x67,0x2b,0xfe,0xd7,0xab,0x76, /*0*/ 

        0xca,0x82,0xc9,0x7d,0xfa,0x59,0x47,0xf0,0xad,0xd4,0xa2,0xaf,0x9c,0xa4,0x72,0xc0, /*1*/

        0xb7,0xfd,0x93,0x26,0x36,0x3f,0xf7,0xcc,0x34,0xa5,0xe5,0xf1,0x71,0xd8,0x31,0x15, /*2*/

        0x04,0xc7,0x23,0xc3,0x18,0x96,0x05,0x9a,0x07,0x12,0x80,0xe2,0xeb,0x27,0xb2,0x75, /*3*/

        0x09,0x83,0x2c,0x1a,0x1b,0x6e,0x5a,0xa0,0x52,0x3b,0xd6,0xb3,0x29,0xe3,0x2f,0x84, /*4*/

        0x53,0xd1,0x00,0xed,0x20,0xfc,0xb1,0x5b,0x6a,0xcb,0xbe,0x39,0x4a,0x4c,0x58,0xcf, /*5*/

        0xd0,0xef,0xaa,0xfb,0x43,0x4d,0x33,0x85,0x45,0xf9,0x02,0x7f,0x50,0x3c,0x9f,0xa8, /*6*/ 

        0x51,0xa3,0x40,0x8f,0x92,0x9d,0x38,0xf5,0xbc,0xb6,0xda,0x21,0x10,0xff,0xf3,0xd2, /*7*/

        0xcd,0x0c,0x13,0xec,0x5f,0x97,0x44,0x17,0xc4,0xa7,0x7e,0x3d,0x64,0x5d,0x19,0x73, /*8*/

        0x60,0x81,0x4f,0xdc,0x22,0x2a,0x90,0x88,0x46,0xee,0xb8,0x14,0xde,0x5e,0x0b,0xdb, /*9*/

        0xe0,0x32,0x3a,0x0a,0x49,0x06,0x24,0x5c,0xc2,0xd3,0xac,0x62,0x91,0x95,0xe4,0x79, /*a*/

        0xe7,0xc8,0x37,0x6d,0x8d,0xd5,0x4e,0xa9,0x6c,0x56,0xf4,0xea,0x65,0x7a,0xae,0x08, /*b*/

        0xba,0x78,0x25,0x2e,0x1c,0xa6,0xb4,0xc6,0xe8,0xdd,0x74,0x1f,0x4b,0xbd,0x8b,0x8a, /*c*/

        0x70,0x3e,0xb5,0x66,0x48,0x03,0xf6,0x0e,0x61,0x35,0x57,0xb9,0x86,0xc1,0x1d,0x9e, /*d*/

        0xe1,0xf8,0x98,0x11,0x69,0xd9,0x8e,0x94,0x9b,0x1e,0x87,0xe9,0xce,0x55,0x28,0xdf, /*e*/

        0x8c,0xa1,0x89,0x0d,0xbf,0xe6,0x42,0x68,0x41,0x99,0x2d,0x0f,0xb0,0x54,0xbb,0x16  /*f*/

    };

//inversepermutationbox

static  unsigned char inversepermutationbox[]=

    { /*  0    1    2    3    4    5    6    7    8    9    a    b    c    d    e    f  */ 

        0x52,0x09,0x6a,0xd5,0x30,0x36,0xa5,0x38,0xbf,0x40,0xa3,0x9e,0x81,0xf3,0xd7,0xfb, /*0*/

        0x7c,0xe3,0x39,0x82,0x9b,0x2f,0xff,0x87,0x34,0x8e,0x43,0x44,0xc4,0xde,0xe9,0xcb, /*1*/

        0x54,0x7b,0x94,0x32,0xa6,0xc2,0x23,0x3d,0xee,0x4c,0x95,0x0b,0x42,0xfa,0xc3,0x4e, /*2*/

        0x08,0x2e,0xa1,0x66,0x28,0xd9,0x24,0xb2,0x76,0x5b,0xa2,0x49,0x6d,0x8b,0xd1,0x25, /*3*/

        0x72,0xf8,0xf6,0x64,0x86,0x68,0x98,0x16,0xd4,0xa4,0x5c,0xcc,0x5d,0x65,0xb6,0x92, /*4*/

        0x6c,0x70,0x48,0x50,0xfd,0xed,0xb9,0xda,0x5e,0x15,0x46,0x57,0xa7,0x8d,0x9d,0x84, /*5*/

        0x90,0xd8,0xab,0x00,0x8c,0xbc,0xd3,0x0a,0xf7,0xe4,0x58,0x05,0xb8,0xb3,0x45,0x06, /*6*/

        0xd0,0x2c,0x1e,0x8f,0xca,0x3f,0x0f,0x02,0xc1,0xaf,0xbd,0x03,0x01,0x13,0x8a,0x6b, /*7*/

        0x3a,0x91,0x11,0x41,0x4f,0x67,0xdc,0xea,0x97,0xf2,0xcf,0xce,0xf0,0xb4,0xe6,0x73, /*8*/

        0x96,0xac,0x74,0x22,0xe7,0xad,0x35,0x85,0xe2,0xf9,0x37,0xe8,0x1c,0x75,0xdf,0x6e, /*9*/

        0x47,0xf1,0x1a,0x71,0x1d,0x29,0xc5,0x89,0x6f,0xb7,0x62,0x0e,0xaa,0x18,0xbe,0x1b, /*a*/

        0xfc,0x56,0x3e,0x4b,0xc6,0xd2,0x79,0x20,0x9a,0xdb,0xc0,0xfe,0x78,0xcd,0x5a,0xf4, /*b*/

        0x1f,0xdd,0xa8,0x33,0x88,0x07,0xc7,0x31,0xb1,0x12,0x10,0x59,0x27,0x80,0xec,0x5f, /*c*/

        0x60,0x51,0x7f,0xa9,0x19,0xb5,0x4a,0x0d,0x2d,0xe5,0x7a,0x9f,0x93,0xc9,0x9c,0xef, /*d*/

        0xa0,0xe0,0x3b,0x4d,0xae,0x2a,0xf5,0xb0,0xc8,0xeb,0xbb,0x3c,0x83,0x53,0x99,0x61, /*e*/

        0x17,0x2b,0x04,0x7e,0xba,0x77,0xd6,0x26,0xe1,0x69,0x14,0x63,0x55,0x21,0x0c,0x7d  /*f*/

    };

AES::AES(void)

{

}

AES::AES(unsigned char* key)

{

    KeyExpansion(key, swapbox);

}

AES::~AES(void)

{

}

/************************************************************************/

/* create a Encrypt method                                              */

/* param : data     encrypt data                                        */

/* param : encryptArray  encryptArray                                   */

/* param : len encrypt data length                                      */

/* return : void                                                        */

/************************************************************************/

void AES::Encrypt(unsigned char* data ,unsigned char * encryptArray,size_t len)

{

    memcpy(encryptArray,data,len);

    Cipher((void *)encryptArray,len);

   

}

/************************************************************************/

/* create a Decrypt method                                              */

/* param : data     decrypt data                                        */

/* param : decryptArray  decryptArray                                   */

/* param : len decrypt data length                                      */

/* return : void                                                        */

/************************************************************************/

void AES::Decrypt(unsigned char * data,unsigned char * decryptArray,size_t len)

{  

    memcpy(decryptArray,data,len);

    InvCipher((void *)decryptArray,len);

}

/************************************************************************/

/* create a Cipher  method  only one time  Encrypt                      */

/* param : input     input encrypt data                                 */

/* return : unsigned char *                                             */

/************************************************************************/

unsigned char* AES::Cipher(unsigned char* input)

{

   

    unsigned char state[AES_KEY_ROW_NUMBER][AES_KEY_COLUMN_NUMBER];

    int i,r,c;

   

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER ;c++)

        {

            state[r][c] = input[c*AES_KEY_COLUMN_NUMBER+r];

        }

    }

    AddRoundKey(state,swapbox[0]);

   

    for(i=1; i<=AES_ROUND_COUNT; i++)

    {

        SubBytes(state);

        ShiftRows(state);

        if(i!=AES_ROUND_COUNT)MixColumns(state);

        AddRoundKey(state,swapbox[i]);

    }

   

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER ;c++)

        {

            input[c*AES_KEY_COLUMN_NUMBER+r] = state[r][c];

        }

    }

    return input;

}

/************************************************************************/

/* create a InvCipher  method  only one time  decrypt                   */

/* param : input     input decrypt data                                 */

/* return : unsigned char *                                             */

/************************************************************************/

unsigned char* AES::InvCipher(unsigned char* input)

{

    unsigned char state[AES_KEY_ROW_NUMBER][AES_KEY_COLUMN_NUMBER];

    int i,r,c;

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER ;c++)

        {

            state[r][c] = input[c*AES_KEY_COLUMN_NUMBER+r];

        }

    }

    AddRoundKey(state, swapbox[10]);

    for(i=9; i>=0; i--)

    {

        InvShiftRows(state);

        InvSubBytes(state);

        AddRoundKey(state, swapbox[i]);

        if(i)

        {

            InvMixColumns(state);

        }

    }  

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER ;c++)

        {

            input[c*AES_KEY_COLUMN_NUMBER+r] = state[r][c];

        }

    }

    return input;

}

/************************************************************************/

/* Create a specified length of data encryption method                  */

/* param : input     input data encryption                              */

/* param : length    Input the length of the encrypted data             */

/* return : unsigned char *                                             */

/************************************************************************/

unsigned char* AES::Cipher(void * input, size_t length)

{

    unsigned char* in = (unsigned char*) input;

    size_t i;

    if(!length)

    {

        while(*(in+length++));

        in = (unsigned char*) input;

    }

    for(i=0; i<length; i+=16)

    {

        Cipher(in+i);

    }

    return (unsigned char*)input;

}

/************************************************************************/

/* Create a specified length of InvCipher method                        */

/* param : input     input data InvCipher                               */

/* param : length    Input the length of the InvCipher data             */

/* return : unsigned char *                                             */

/************************************************************************/

unsigned char* AES::InvCipher(void * input, size_t length)

{

    unsigned char* in = (unsigned char*) input;

    size_t i;

    for(i=0; i<length; i+=16)

    {

        InvCipher(in+i);

    }

    return (unsigned char*)input;

}

/************************************************************************/

/*Create key method                                                     */

/* param : key      input data encryption key                           */

/* param : swapbox  Conversion of key array                             */

/* return : void                                                        */

/************************************************************************/

void AES::KeyExpansion(unsigned char* key, unsigned char swapbox[][4][4])

{

    int i,j,r,c;

    unsigned char rc[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            swapbox[0][r][c] = key[r+c*AES_KEY_COLUMN_NUMBER];

        }

    }

    for(i=1; i<=10; i++)

    {

        for(j=0; j<AES_KEY_COLUMN_NUMBER; j++)

        {

            unsigned char t[AES_KEY_ROW_NUMBER];

            for(r=0; r<AES_KEY_ROW_NUMBER; r++)

            {

                t[r] = j ? swapbox[i][r][j-1] : swapbox[i-1][r][3];

            }

            if(j == 0)

            {

                unsigned char temp = t[0];

                for(r=0; r<AES_KEY_ROW_NUMBER-1; r++)

                {

                    t[r] = permutebox[t[(r+1)%AES_KEY_ROW_NUMBER]];

                }

                t[3] = permutebox[temp];

                t[0] ^= rc[i-1];

            }

            for(r=0; r<AES_KEY_ROW_NUMBER; r++)

            {

                swapbox[i][r][j] = swapbox[i-1][r][j] ^ t[r];

            }

        }

    }

}

/************************************************************************/

/*Create mixed operation method ranks                                   */

/* param : a      row  char                                             */

/* param : b      column  char                                          */

/* return : unsigned char                                               */

/************************************************************************/

unsigned char AES::FFmul(unsigned char a, unsigned char b)

{

    unsigned char bw[AES_KEY_ROW_NUMBER];

    unsigned char res=0;

    int i;

    bw[0] = b;

    for(i=1; i<AES_KEY_ROW_NUMBER; i++)

    {

        bw[i] = bw[i-1]<<1;

        if(bw[i-1]&0x80)

        {

            bw[i]^=0x1b;

        }

    }

    for(i=0; i<AES_KEY_ROW_NUMBER; i++)

    {

        if((a>>i)&0x01)

        {

            res ^= bw[i];

        }

    }

    return res;

}

/************************************************************************/

/* Create bytes alternatives                                            */

/* param :  state[][]  Byte array alternative                           */

/* return : void                                                        */

/************************************************************************/

void AES::SubBytes(unsigned char state[][AES_KEY_COLUMN_NUMBER])

{

    int r,c;

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            state[r][c] = permutebox[state[r][c]];

        }

    }

}

/************************************************************************/

/* Create rows transform method                                         */

/* param :  state[][]  line array alternative                           */

/* return : void                                                        */

/************************************************************************/

void AES::ShiftRows(unsigned char state[][AES_KEY_COLUMN_NUMBER])

{

    unsigned char t[AES_KEY_COLUMN_NUMBER];

    int r,c;

    for(r=1; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            t[c] = state[r][(c+r)%AES_KEY_COLUMN_NUMBER];

        }

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            state[r][c] = t[c];

        }

    }

}

/************************************************************************/

/* Create columns transform method                                      */

/* param :  state[][]  columns array alternative                        */

/* return : void                                                        */

/************************************************************************/

void AES::MixColumns(unsigned char state[][AES_KEY_COLUMN_NUMBER])

{

    unsigned char t[AES_KEY_ROW_NUMBER];

    int r,c;

    for(c=0; c< AES_KEY_COLUMN_NUMBER; c++)

    {

        for(r=0; r<AES_KEY_ROW_NUMBER; r++)

        {

            t[r] = state[r][c];

        }

        for(r=0; r<AES_KEY_ROW_NUMBER; r++)

        {

            state[r][c] = FFmul(0x02, t[r])

                        ^ FFmul(0x03, t[(r+1)%AES_KEY_COLUMN_NUMBER])

                        ^ FFmul(0x01, t[(r+2)%AES_KEY_COLUMN_NUMBER])

                        ^ FFmul(0x01, t[(r+3)%AES_KEY_COLUMN_NUMBER]);

        }

    }

}

/************************************************************************/

/*Create round keys plus transform method                               */

/* param :  state[][]  keys plus array alternative                      */

/* param :  k[][]  temp array alternative                               */

/* return : void                                                        */

/************************************************************************/

void AES::AddRoundKey(unsigned char state[][AES_KEY_COLUMN_NUMBER], unsigned char k[][AES_KEY_COLUMN_NUMBER])

{

    int r,c;

    for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

    {

        for(r=0; r<AES_KEY_ROW_NUMBER; r++)

        {

            state[r][c] ^= k[r][c];

        }

    }

}

/************************************************************************/

/* Create InvSubBytes alternatives                                      */

/* param :  state[][]  InvSubBytes array alternative                    */

/* return : void                                                        */

/************************************************************************/

void AES::InvSubBytes(unsigned char state[][AES_KEY_COLUMN_NUMBER])

{

    int r,c;

    for(r=0; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            state[r][c] = inversepermutationbox[state[r][c]];

        }

    }

}

/************************************************************************/

/* Create InvShiftRows transform method                                 */

/* param :  state[][]  InvShiftRows array alternative                   */

/* return : void                                                        */

/************************************************************************/

void AES::InvShiftRows(unsigned char state[][AES_KEY_COLUMN_NUMBER])

{

    unsigned char t[AES_KEY_COLUMN_NUMBER];

    int r,c;

    for(r=1; r<AES_KEY_ROW_NUMBER; r++)

    {

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            t[c] = state[r][(c-r+AES_KEY_COLUMN_NUMBER)%AES_KEY_COLUMN_NUMBER];

        }

        for(c=0; c<AES_KEY_COLUMN_NUMBER; c++)

        {

            state[r][c] = t[c];

        }

    }

}

/************************************************************************/

/* Create InvMixColumns transform method                                */

/* param :  state[][]  InvMixColumns array alternative                  */

/* return : void                                                        */

/************************************************************************/

void AES::InvMixColumns(unsigned char state[][AES_KEY_COLUMN_NUMBER])

{

    unsigned char t[AES_KEY_ROW_NUMBER];

    int r,c;

    for(c=0; c< AES_KEY_COLUMN_NUMBER; c++)

    {

        for(r=0; r<AES_KEY_ROW_NUMBER; r++)

        {

            t[r] = state[r][c];

        }

        for(r=0; r<AES_KEY_ROW_NUMBER; r++)

        {

            state[r][c] = FFmul(0x0e, t[r])

                        ^ FFmul(0x0b, t[(r+1)%AES_KEY_ROW_NUMBER])

                        ^ FFmul(0x0d, t[(r+2)%AES_KEY_ROW_NUMBER])

                        ^ FFmul(0x09, t[(r+3)%AES_KEY_ROW_NUMBER]);

        }

    }

}

//TestEncryption.cpp 用于测试主方法

#include <stdio.h>

#include <string.h>

#include <istream>

#include <vector>

unsigned char key[] =

{

    'v' ,'b','c','d',

    'f' ,'i','n','o',

    'e' ,'w','t','i',

    'q' ,'x','l','p',

       

    /*0xff, 0x7e, 0x15, 0x16,

    0x28, 0xae, 0xd2, 0xa6,

    0xab, 0xf7, 0x15, 0x88,

    0x09, 0xcf, 0x4f, 0x3c*/

};

int main()

{

    Encryption* aes = EncryptionFactory::getEncryption(0,key);

    char* s="1234567891234567abcdefghijklmnop ";

   

    unsigned char * strEncrypt = aes->encrypt(s);

    puts((char*)strEncrypt);

    unsigned char * strDecrypt = aes->decrypt((char*)strEncrypt);

    puts((char*)strDecrypt);

    getchar();

    return 0;

}

更多相关推荐:
DES加密算法实验报告

网络安全作业题目DES学号专业及班级姓名日期20xx0414加密算法网络工程0902班一DES简介DES是一个分组密码算法使用64位密钥除去8位奇偶校验实际密钥长度为56位对64比特的数据分组二进制数据加密产生...

RSA加密算法实验报告

四川大学计算机学院实验报告

AES加密算法实验报告

实验报告AES加密算法一实验环境1硬件配置酷睿i3cpu2G内存2使用软件1操作系统windows7旗舰版2软件工具visualc60二AES涉及的相关概念或基本原理简介密码学中的高级加密标准AdvancedE...

DES加密算法实验报告

DES加密算法实验报告在DES加密算法中加密方使用一个64位明文与56位密钥来生成64位的密文解密方通过64位的密文与56位密钥还原出明文在此过程中加解密双方使用一个56位密钥DES加密算法一般结构如下DES加...

RSA加密算法实验报告

信息与计算科学专业操作性实验报告年级20xx级姓名学号指导教师实验课程名称RSA加密算法开课实验室理学楼210实验内容1实验作业题目用Cbuilder实现RSA加密算法2实验作业课时4个课时3实验过程包括实验环...

DES加密算法实验报告

苏州科技学院实验报告学生姓名杨刘涛学号1220xx6117指导教师陶滔刘学书1220xx6114实验地点计算机学院大楼东309实验时间20xx0420一实验室名称软件实验室二实验项目名称DES加解密算法实现三实...

DES加密算法的简单实现实验报告

苏州科技学院电子与信息工程学院实验报告实验一实验课程名称实验名称实验报告一实验室名称电子学院213机房二实验项目名称DES加密算法的简单实现三实验学时2学时四实验原理DES的描述DES是一种分组加密算法他以64...

计算机网络安全传统加密算法实验报告

北京林业大学20xx学年20xx学年第2学期计算机网络安全实验报告书专业计算机科学与技术班级计算机122姓名侯丹学号120xx4227实验地点N01任课教师蒋东辰实验题目传统加密算法实验环境Windows操作系...

加密算法编程实验

天津机电职业技术学院教师备课纸实验五加密算法编程一实验目的通过C语言编程实现替代加密算法加深对古典密码体制的了解二实验环境1安装WindowsXP系统的计算机2WinTC三实验理论基础凯撒密码caeser是罗马...

DES_加密解密算法的C++实现--实验报告

实验报告课程名称高级Java程序设计实验项目搭建JSP开发和运行环境实验仪器个人计算机系别理学院专业信息与计算科学班级学号信计110220xx012529学生姓名高敏实验日期20xx311成绩指导教师徐莉实验项...

DES 加密解密算法的C++实现--实验报告

网络与信息安全IntroductiontoNetworkandSecurityDES加密解密算法的C实现姓名学号学院20xx年10月一DES算法的实现1DES简介本世纪五十年代以来密码学研究领域出现了最具代表性...

RSA加密算法实验报告

现代密码学实验报告题目RSA算法的实现过程一实验目的简单实现RSA过程通过OpenSSL命令编辑器实现发送方对明文进行加密签名接受方验证解密的简单过程二实验原理RSA加密算法的基本流程三实验步骤发送方对明文进行...

加密算法实验总结(22篇)