|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 陈尚涵 于 2023-12-23 17:28 编辑
今天下午闲的没事 玩原神 研究字符串加密
那么来看一下加密过程吧
1.需要输入一个要加密的字符串和字符串密钥
2.计算字符串密钥中每一个字符的ascii码的和
3.从和中提取四个信息
4.用其中一个信息作为种子,对于字符串的每一个大小写字母,都增加不同的值,这里使用随机数,这个过程重复另一个信息次
5.用其中一个信息作为种子,通过随机数交换两个数的值,这个过程重复另一个信息次
6.结束
然后是解密,跟加密过程反着来就可以了,主要是要先用数组提取随机数,再倒过来使用随机数,所以速度比加密慢一倍
好吧,过程确实很简单,但是我这个蒟蒻花了两个半小时从构思到写代码
ps.建议不要使用汉字或其他语言,应使用英语,以免发生奇奇怪怪的bug
然后就是食用过程
比如说要加密我们还需要一个密钥,比如可以是网名,比如我的网名就是那么运行加密,输入得到这个就是加密后的了
接下来解密,一样,输入就可以解出来了那么上代码
加密代码:#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
bool isalpha(char ch){
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
return true;
}
return false;
}
char change(char str[], int len, int seed, int ts){
srand(seed);
for (int i = 1; i <= ts; i++){
for (int j = 0; j < len; j++){
if (!isalpha(str[j])){
continue;
}
int x = rand()%26;
for (int k = 1; k <= x; k++){
if (str[j]=='z'||str[j]=='Z'){
str[j]-='z'-'a';
} else {
str[j]++;
}
}
}
}
}
void move(char str[], int len, int seed, int ts){
srand(seed);
for (int i = 1; i <= ts; i++){
int x = rand()%len;
int y = rand()%len;
char ch = str[x];
str[x] = str[y];
str[y]= ch;
}
}
int sigma(char str[], int len){
int sum = 0;
for(int i = 0; i < len; i++){
sum += str[i];
}
return sum;
}
int main(){
char str[666];
char key[666];
cin.getline(str,666);
cin.getline(key,666);
int len = strlen(str);
int keylen = strlen(key);
int sum = sigma(key, keylen);
int movets = sum / 26;
int changets = sum % 26;
int moveseed = sum - movets;
int changeseed = sum - changets;
change(str, len, changeseed, changets);
move(str, len, moveseed, movets);
cout << str;
return 0;
}
解密代码#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
bool isalpha(char ch){
if ((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
return true;
}
return false;
}
char change(char str[], int len, int seed, int ts){
srand(seed);
int xr[114514];
int cnt = 0;
int isalphats = 0;
for (int i = 1; i <= ts; i++){
for (int j = len - 1; j >= 0; j--){
if (isalpha(str[j])){
isalphats++;
}
}
}
for (int i = 1; i <= isalphats; i++){
xr[cnt++] = rand();
}
int now = cnt - 1;
for (int i = 1; i <= ts; i++){
for (int j = len - 1; j >= 0; j--){
if (!isalpha(str[j])){
continue;
}
int x = xr[now--]%26;
for (int k = 1; k <= 26-x; k++){
if (str[j]=='z'||str[j]=='Z'){
str[j]-='z'-'a';
} else {
str[j]++;
}
}
}
}
}
void move(char str[], int len, int seed, int ts){
int xr[114514];
int yr[114514];
int cnt = 0;
srand(seed);
for (int i = 1; i <= ts; i++){
xr[cnt] = rand()%len;
yr[cnt] = rand()%len;
cnt++;
}
int now = cnt - 1;
for (int i = 1; i <= ts; i++){
int x = xr[now];
int y = yr[now];
now--;
char ch = str[x];
str[x] = str[y];
str[y]= ch;
}
}
int sigma(char str[], int len){
int sum = 0;
for(int i = 0; i < len; i++){
sum += str[i];
}
return sum;
}
int main(){
char str[666];
char key[666];
cin.getline(str,666);
cin.getline(key,666);
int len = strlen(str);
int keylen = strlen(key);
int sum = sigma(key, keylen);
int movets = sum / 26;
int changets = sum % 26;
int moveseed = sum - movets;
int changeseed = sum - changets;
move(str, len, moveseed, movets);
change(str, len, changeseed, changets);
cout << str;
return 0;
}
喜欢的话可以给我评分吗
|
评分
-
查看全部评分
|