koorio.com
海量文库 文档专家
赞助商链接
当前位置:首页 >> 计算机软件及应用 >>

云南大学 信息安全技术 实验一 Base64


云南大学软件学院
实验
课程名称 实验目的 1. 2. 3. 信息安全技术


实验项目


Base 64 加解密

实现 Base64 的实现算法。 使用实现的算法对数据进行加密 使用实现的算法对加密的文件进行解密

一、实验原理: 1.Base64 简介: Base64 是网络上最常见的用于传输 8Bit 字节代码的编码方式之一, 可用于在 HTTP 环境下传 递较长的标识信息。采用 Base64 编码不仅比较简短,同时也具有不可读性,即所编码的数据 不会被人用肉眼所直接看到。能有效的保护传输信息。 2.编码的规则: Base64 编码要求把 3 个 8 位字节(3*8=24)转化为 4 个 6 位的字节(4*6=24) ,之后在 6 位 的前面补两个 0,形成 8 位一个字节的形式。 如果需要被编码数据的剩余部分不足 24 位, 则要执行特殊的操作。 编码量通常在主体 (body) 结尾部分结束。当输入少于 24 位时,会在末尾(右侧)添加一些值为 0 的位,以形成完整的 6 位组。用“=”来表示数据结尾的填充。因为所有 base64 的输入都是完整的字节,所以只可能出 现如下情况: (1)最后的编码输入是完整的 24 位;这时,编码输出的最后一个单元会是完整的 4 个不为“=” 的个字符。(2)最后的输入是 8 位;这时,编码输出的最后一个单元是两个编码字符后接两个 填充字符“=”。(3)最后的输入刚好是 16 位;这时,编码输出的最后一个单元是三个编码字符 后接一个填充字符“=”。因为“=”是用来填充数据的结尾部分,所以,它的出现意味着可能已经 到达数据末尾(但不切断传输)。然而,也可能无法以这种方式进行判断:当传输的字节个数是 三的整数倍时,编码中就不会出现“=”。在 base64 编码数据中,要忽略任何不属于 base64 字 母表的字符。 具体步骤: (1)把 3 个字符变成 4 个字符; (2)每 76 个字符加一个换行符; (3)最后的结束符也要处理 3.Base64 索引表: Value Char 0 1 2 3 A B C D Value Char 16 17 18 19 Q R S T Value Char 32 33 34 35 g h i j Value Char 48 49 50 51 w x y z

实验内容 (算法、 程序、步 骤和方 法)

4 5 6 7 8 9 10 11 12 13 14 15

E F G H I J K L M N O P

20 21 22 23 24 25 26 27 28 29 30 31

U V W X Y Z a b c d e f

36 37 38 39 40 41 42 43 44 45 46 47

k l m n o p q r s t u v

52 53 54 55 56 57 58 59 60 61 62 63

0 1 2 3 4 5 6 7 8 9 + /

二、实验 内容: 1. 实现 Base64 的实现算法。 2. 使用实现的算法对数据进行加密 3. 使用实现的算法对加密的文件进行解密三、详细步骤: 三、实验步骤 1 .Base64 的实验流程图
开始

输入文件路径与文件名 选择加解密操作 正确 不正确 是否为正确路径 与文件名 加密 解密

文件读取 Base64算法加密 Base64算法解密

结束

按照路径输出文件

2.Base64 的算法实现 #include <stdio.h> typedef unsigned char uint8_t; typedef unsigned short uint16_t; // 索引范围:0~63,根据索引值从以下字符串中找到编码 char *Base64Code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // 从 data 获取每个 8 位的原文,前后两个为一组计算得到各自的索引, // 用来找 base64 编码,结果保存到 buffer void encode_base64(uint8_t *buffer, uint8_t *data, uint16_tlen) { uint8_t *bp = buffer; // 保存最新编码的位置 uint8_t *p = data; // 原文 uint8_tc1, c2; // 从原文里得到前后两个数据为一组求索引 while (p < data + len) { c1 = *p++; // 若 c1 == 1010 1101 *bp++ = Base64Code[(c1>> 2)]; // 'r' == Base64Code[43] c1 = (c1&0x03) << 4; // c1 == 0001 0000 if (p >= data + len) { // p 已经到 data 末尾,后面没有数据了 *bp++ = Base64Code[c1]; // 后面没有 c2 可以连接,直接由 c1 查表 break; // 退出编码 } c2 = *p++; // 若 c2 == 1011 1010 c1 |= (c2>> 4) &0x0f; // c1 == 0001 1011 *bp++ = Base64Code[c1]; // 'b' == Base64Code[27] c1 = (c2&0x0f) << 2; // c1 == 00 1010 00 if (p >= data + len) { // p 已经到 data 末尾,后面没有数据了 *bp++ = Base64Code[c1]; // 后面没有 c2 可以连接,直接由 c1 查表 break; // 退出编码 } c2 = *p++; // 若后面还有数据,而且赋值给,令 c2 == 01 11 0110 c1 |= (c2>> 6) &0x03; // c1 == 00 1010 01 *bp++ = Base64Code[c1]; // 'p' == Base64Code[41] *bp++ = Base64Code[c2&0x3f]; // c2&0x3f == 00 11 0110 , // '2' == Base64Code[54] } *bp = '\0'; } int main() { uint8_t buffer[5]; uint8_t data[3] = {0xAD,0xBA,0x76}; // 原文例子 encode_base64(buffer,data,3); printf("%s",buffer); // 编码结果

return 1; } 1. 加解密操作界面 (1) 加密

数据记录 和计算

(2)解密

本次试验收获:了解 Base64 的基本原理与实现方法,对于 base64 的算法我有一下体会: 如果需要被编码数据的剩余部分不足 24 位, 则要执行特殊的操作。 编码量通常在主体 (body) 结尾部分结束。当输入少于 24 位时,会在末尾(右侧)添加一些值为 0 的位,以形成完整的 6 位组。用“=”来表示数据结尾的填充。因为所有 base64 的输入都是完整的字节,所以只可能出 现如下情况: (1)最后的编码输入是完整的 24 位;这时,编码输出的最后一个单元会是完整的 4 个不为“=” 的个字符。(2)最后的输入是 8 位;这时,编码输出的最后一个单元是两个编码字符后接两个 填充字符“=”。(3)最后的输入刚好是 16 位;这时,编码输出的最后一个单元是三个编码字符 后接一个填充字符“=”。因为“=”是用来填充数据的结尾部分,所以,它的出现意味着可能已经 到达数据末尾(但不切断传输)。然而,也可能无法以这种方式进行判断:当传输的字节个数是 三的整数倍时,编码中就不会出现“=”。在 base64 编码数据中,要忽略任何不属于 base64 字 母表的字符。 指导教师签名:

结论 (结果)


赞助商链接
推荐相关:
网站首页 | 网站地图
All rights reserved Powered by 酷我资料网 koorio.com
copyright ©right 2014-2019。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com