现代密码学-RC4校验 实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

现代密码学

院系:理学院

班级:信安二班

姓名:

学号:

前言

密码学(Cryptology)是研究秘密通信的原理和破译秘密信息的方法的一门学科。密码学的基本技术就是对数据进行一组可逆的数学变换,使未授权者不能理解它的真实含义。密码学包括密码编码学(Cryptography)和密码分析学(Cryptanalyst)两个既对立又统一的主要分支学科。研究密码变化的规律并用之于编制密码以保护信息安全的科学,称为密码编码学。研究密码变化的规律并用之于密码以获取信息情报的科学,称为密码分析学,也叫密码破译学。

密码学在信息安全中占有非常重要的地位,能够为信息安全提供关键理论与技术。密码学是一门古老而深奥的学问,按其发展进程,经历了古典密码和现代密码学两个阶段。现代密码学(Modern Cryptology)通常被归类为理论数学的一个分支学科,主要以可靠的数学方法和理论为基础,为保证信息的机密性、完整性、可认证性、可控性、不可抵赖性等提供关键理论与技术。

RC4密码算法算法实现

实验目的:

理解流密码的概念及相关结构; 理解并能够编写基本的流密码体制; 熟练应用C/C++编程实现RC4密码算法体制。

实验内容:

编程实现RC4加/解密算法。

实验原理:

RC4算法是一种序列密码体制或称流密码体制,其加密密钥和解密密钥相同RC4的

密钥长度可变,但为了确保哪去安全强度,目前RC4至少使用128位的密钥。

用1~256个字节(8~2048位)的可变长度密钥初始化一个256个字节的状态向量S,S的元素记为S[0],S[1],…,S[255],从始至终置换后的S包含从0到255的所有8位数。对于加密和解密,字节K是从S的255个元素中按一种系统化的方式选出的一个元素生成的。每生成一个K的值,S中的元素个体就被重新置换一次。

实验代码:

Encrypt.h文件:

#ifndef _ENCRYPT_RC4_

#define _ENCRYPT_RC4_

#include

#define BOX_LEN 256

intGetKey(const unsigned char* pass, intpass_len, unsigned char *out);

int RC4(const unsigned char* data, intdata_len, const unsigned char* key, intkey_len, unsigned char* out, int* out_len);

static void swap_byte(unsigned char* a, unsigned char* b);

char* Encrypt(const char* szSource, const char* szPassWord); // 加密,返回加密结果

char* Decrypt(const char* szSource, const char* szPassWord); // 解密,返回解密结果

char* ByteToHex(const unsigned char* vByte, constintvLen); // 把字节码pbBuffer

转为十六进制字符串,方便传输

unsigned char* HexToByte(const char* szHex); // 把十六进制字符串转为字节码pbBuffer,解码

#endif // #ifndef _ENCRYPT_RC4_

Encrypt.cpp文件:

#include "Encrypt.h"

char* Encrypt(const char* szSource, const char* szPassWord) // 加密,返回加密结果

{

if(szSource == NULL || szPassWord == NULL) return NULL;

unsigned char* ret = new unsigned char[strlen(szSource)];

intret_len = 0;

if(RC4((unsigned char*)szSource,

strlen(szSource),

(unsigned char*)szPassWord,

strlen(szPassWord),

ret,

&ret_len) == NULL)

return NULL;

char* ret2 = ByteToHex(ret, ret_len);

delete[] ret;

return ret2;

}

char* Decrypt(const char* szSource, const char* szPassWord) // 解密,返回解密结果

{

if(szSource == NULL || (strlen(szSource)%2 != 0) || szPassWord == NULL) return NULL;

unsigned char* src = HexToByte(szSource);

unsigned char* ret = new unsigned char[strlen(szSource) / 2 + 1];

intret_len = 0;

memset(ret, strlen(szSource) / 2 + 1,0);

if(RC4(src, strlen(szSource) / 2, (unsigned char*)szPassWord, strlen(szPassWord), ret, &ret_len) == NULL)

return NULL;

ret[ret_len] = '/0';

return (char*)ret;

}

int RC4(const unsigned char* data, intdata_len, const unsigned char* key, intkey_len, unsigned char* out, int* out_len)

{

if (data == NULL || key == NULL || out == NULL)

return NULL;

unsigned char* mBox = new unsigned char[BOX_LEN];

相关文档
最新文档