关于加密和解密问题,有的加密算法是不存在解密算法的(原因就是加密算法的不可逆性,即无法通过算法将密文还原),有的加密存在解密算法(原因是其加密过程是可逆的,即可以通过逆向算法将密文还原)。然而单独的一种加密算法不一定可靠,这时可以将多种加密算法组合使用。至于相关的加密算法各位自己去了解。
下面介绍一个简单的加密/解密算法实例,希望对此加密解密算法有一定认识:
首先介绍加密算法: 主要加密计算为 '^' 原因是 '^'运算是可逆的,如二进制数 1^0 = 1, 1^1 = 0; 0^1 = 1, 0^0 = 0;
所以 1 = 1^0^0,即是加密部分为 [1^0] = r, 解密部分为[r^0], 所以解密算法就是将密文与加密数据0在进行一次'^'运算,以此类推就可以实现多位二进制的加密解密。在计算执行的指令都是二进制数,这里就需要理解为什么十进制和ASCII码同样可以使用'^'运算进行加密解密.`
c++源代码:
example_1:
#include <iostream>
#define KEY 1313113
using namespace std;
//加密算法
int encrypt(int src_pass, int key){
return src_pass^key;
}
//解密算法
int decrypt(int des_pass, int key){
return des_pass^key;
}
int main(){
int src_pass = 2000;
cout<<src_pass<<endl;
int des_pass = encrypt(src_pass, KEY);
cout<<des_pass<<endl;
int result = decrypt(des_pass, KEY);
cout<<result<<endl;
return 0;
}
example2:
#include <iostream>
#include <windows.h>
#define L 6
using namespace std;
//原始数据
int mess[L] = {-23, -28, -19, -19, -18, -10};
//对原始数据进行加密
//加密算法
void encrypt(char *arr, int len){
for(int i = 0; i < len; i++){
arr[i] |= -0x80; //希望读者了解ascii^-0x80,这里等价于 ascii^0x80
arr[i] ^= 0x1;
}
}
//解密算法
void decrypt(char *arr, int len){
for(int i = 0; i < len; i++){
arr[i] ^= 0x1;
arr[i] ^= 0x80; //对ascii最高位进行了加密'^'运算,当然也要进行解密'^'运算
}
}
bool judge(char* arr, int index){
if(index < 0){
return true;
}else{
if((int)arr[index] == mess[index]){
judge(arr, index-1);
}else{
return false;
}
}
return true;
}
//测试用
void print_(char *arr, int len){
for(int i = 0; i < len; i++){
cout<<(int)arr[i]<<", ";
}
cout<<endl;
}
//测试用
string print(char *arr, int len){
string tmp = "";
for(int i = 0; i < len; i++){
tmp += arr[i];
}
return tmp;
}
//测试时的源代码
int main()
{
char *arr = new char[L];
cout<<"please input the password: ";
for(int i = 0; i < L; i++){
cin>>arr[i];
}
string tmp = "";
tmp = print(arr, L);
cout<<tmp<<endl;
encrypt(arr, L);
print_(arr, L);
tmp = print(arr, L);
cout<<tmp<<endl;
decrypt(arr, L);
tmp = print(arr, L);
cout<<tmp<<endl;
if(judge(arr, L-1)){
cout<<"you is the user, hello!!"<<endl;
}else{
cout<<"you are not the user!!!"<<endl;
}
system("pause");
return 0;
}
希望两个小例子,各位能够有所收获。