IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言base64加密 -> 正文阅读

[C++知识库]c语言base64加密

一.程序目的

使用c/c++完成以下下算法:

输入一个字符串,检查该字符串总ascii码值。如果值大于1000则对该字符串进行base64加密输出,否则该字符串与base64编码表进行异或输出

二.程序代码

代码如下:

#include<stdio.h>
#include<string.h>
int main(){
	char x[1000]="",y[1000]="",z[1000]="";
	char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	int i,sum=0,len=0,j;
	printf("请输入字符串:");
	gets(x);
	len=strlen(x);
	for(i=0;i<len;i++){

		sum=sum+x[i];
	}

	for(i=0,j=0;j<len;i+=4,j+=3){
		y[i]=base[x[j]>>2];
		y[i+1]=base[(x[j]&0x3)<<4|(x[j+1]>>4)];
		y[i+2]=base[(x[j+1]&0xf)<<2|(x[j+2]>>6)];
		y[i+3]=base[(x[j+2]&0x3f)];
	}
    switch(len%3){
     case 1:{
        y[i-2]='=';
		y[i-1]='=';
		break;
    }
     case 2:
        {
        y[i-1]='=';
        break;
        }
    }

	if(sum>1000){
		printf("字符串的ASCII值为%d\n",sum);
		printf("输入的字符串ASCII值大于1000\n");
		printf("base64加密:");
		puts(y);
	}
	else{
		printf("输入的字符串ASCII值小于1000,将与base64编码表进行异或运算\n");
		printf("异或运算后的结果为:");
		for(i=0;i<len;i++){
			z[i]=x[i]^base[i];
		}
		puts(z);
	}

    }

三.程序分析

1.这里先说一下base64加密

通常一个字节是8位,而base64加密是使这些8位的变为6位,就比如说“ABC”对应的二进制:

01000001 01000010 01000011

转为六位就是:(010000) (010100)(001001)(000011)

而正是其最多只有六位,2的6次方=64,base64由此得名,且base64编码表中总共有64个字符,如下表

点击查看图片来源

通过上表,base64加密“ABC”得:QUJD

若有两个字符,比如“12”的二进制:00110001 00110010

转为六位一组就是 001100 010011 001000(不够自动补0)

本来按这样的规律base64加密是:MTI

但像这种2%3=2的字符串长度,需要再补上‘=’,也就是最后的加密结果是:MTI=

若字符串长度为1,也就是1%3=1,需要在加密过后再补上两个‘=’;

2.代码分析

#include<stdio.h>
#include<string.h>
int main(){
	char x[1000]="",y[1000]="",z[1000]="";//初始化数组
	char base[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";//引入base64编码表
	int i,sum=0,len=0,j;
	printf("请输入字符串:");
	gets(x);
	len=strlen(x);//获取字符串长度
	for(i=0;i<len;i++){

		sum=sum+x[i];
	}

这一段主要是初始化数组,输入字符串并计算字符串的ASCII值

for(i=0,j=0;j<len;i+=4,j+=3){
		y[i]=base[x[j]>>2];
		y[i+1]=base[(x[j]&0x3)<<4|(x[j+1]>>4)];
		y[i+2]=base[(x[j+1]&0xf)<<2|(x[j+2]>>6)];
		y[i+3]=base[(x[j+2]&0x3f)];
	}
    switch(len%3){
     case 1:{
        y[i-2]='=';
		y[i-1]='=';
		break;
    }
     case 2:
        {
        y[i-1]='=';
        break;
        }
    }

这一段是对输入的字符串进行base64加密

for循环理论不知道该咋说,只能举个栗子,

比如输入ABC,对应的二进制也就是:01000001 01000010 01000011,让第一组二进制左移两位,也就是010000,得到第一组六位base 010000;

然后再让01000001与0x3(也就是11)进行与运算,也就把01000001的后两位提出来,然后左移四位也就得到010000,就是第二组base的前两位,再与右移四位的01000010(即0100)进行或运算,得到第二组六位base 010100;

第三组base就是让01000010&0xf(也就是1111)得到0010接着左移两位得到001000,01000011右移两位得到01,001000|01得到第三组base 001001;

第四组base就01000011&0x3f(也就是111111)得到000011

添加‘=’的这段代码,我也不会讲,也只能举个栗子

比如输入的字符串是‘1’,经过for循环之后,i的值为4,也就是y数组长度为5,但是从y[i-2]的值就是空的,所以添加‘=’要从y[i-2]开始赋值,由于y[i]里面没有存储值,所以数组长度就是4,而1%3=1,也符合上面的代码(感觉讲的好乱,不过我确实尽力了QAQ)

if(sum>1000){
		printf("字符串的ASCII值为%d\n",sum);
		printf("输入的字符串ASCII值大于1000\n");
		printf("base64加密:");
		puts(y);
	}
	else{
		printf("输入的字符串ASCII值小于1000,将与base64编码表进行异或运算\n");
		printf("异或运算后的结果为:");
		for(i=0;i<len;i++){
			z[i]=x[i]^base[i];
		}
		puts(z);
	}

    }

ASCII值大于1000,作base64加密并输出

ASCII值小于1000,原字符串与base64编码表进行异或运算并输出

四.运行结果及验证

程序运行结果:
在这里插入图片描述

在线base64加密验证:

在这里插入图片描述

ASCII值小于1000,原字符串与base64编码表进行异或运算并输出

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:30:43  更:2022-04-30 08:31:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:31:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码