现代密码学-RC4校验 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];