|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
喜欢的话可以给我评分吗
|
评分
-
查看全部评分
|