开头
大家好,我叫这是我58。你知道我的原创加密技术——超撒加密吗?如果你不知道,可以点一下这里,并且,在今天,我已经把无bug版的超撒加密程序给做出来了。做出来的这个程序如下。
程序
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void supersar(char* str, char* strs, int ipass) {
int inl = 0;
int inr = 0;
int ia = 0;
int iak = 0;
int keyarr[99999] = { 0 };
char strno[] = "要";
char keystr[99999] = "";
ipass && strcpy(strno, "有");
printf("左边的干扰字符%s多少长度?(正整数) -> ", strno);
do {
scanf("%d", &inl);
inl < 0 && printf("输入错误,请重新输入一遍(正整数) -> ");
} while (inl < 0);
printf("右边的干扰字符%s多少长度?(正整数) -> ", strno);
do {
scanf("%d", &inr);
inr < 0 && printf("输入错误,请重新输入一遍(正整数) -> ");
} while (inr < 0);
if (!ipass) {
//初始化
for (; ia < 10000; ia++) {
keyarr[ia] = 96;
}
//前干扰字符
for (ia = 0; ia < inl; ia++) {
strs[ia] = rand() % 95 + 32;
}
//超撒加密
for (; ia < inl + strlen(str); ia++) {
keyarr[ia - inl] = rand() % 95;
strs[ia] = str[ia - inl];
for (iak = keyarr[ia - inl]; iak > 0; iak--) {
127 == ++strs[ia] && (strs[ia] = ' ');
}
}
//后干扰字符
for (ia = 0; ia < inr; ia++) {
strs[inl + ia + strlen(str)] = rand() % 95 + 32;
}
//输出密钥
for (printf("密钥:"), ia = 0; 96 != keyarr[ia]; ia++) {
printf("%c", keyarr[ia] + 32);
}
printf("\n");
}
else {
char* pc = keystr;
//密钥询问
printf("密钥为多少? -> ");
while ('\n' != getchar()) {
;
}
while (*pc=getchar(), '\n' != *pc++) {
;
}
//超撒解密
for (*pc = '\0', ia = inl; ia < strlen(str) - inr; ia++) {
iak = keystr[ia - inl] - 32;
strs[ia - inl] = str[ia];
for (; iak > 0; iak--) {
strs[ia - inl]--;
31 == strs[ia - inl] && (strs[ia - inl] = '~');
}
}
}
}
int main() {
char str[99999] = "";
int i = 0;
srand((unsigned int)time(NULL));
while (1) {
char strp[] = "加";
printf("你要用超撒密码加密还是解密?(0加密,非0解密) -> ");
scanf("%d", &i);
printf("请输入你要用超撒密码%s密的字符串(不能有控制字符) -> ", (i && strcpy(strp, "解"), strp));
char* pc = str;
while ('\n' != getchar()) {
;
}
while (*pc = getchar(), '\n' != *pc) {
if (!(*pc > 31 && *pc++ < 127)) {
printf("输入错误,请重新输入 -> ");
while ('\n' != getchar()) {
;
}
while (pc != str) {
*pc-- = '\0';
}
}
}
*pc = '\0';
char strs[99999] = "";
supersar(str, strs, i);
printf("%s密之后的字符串 -> %s\n------------------------------------------\n", strp, strs);
}
return 0;
}
程序的流程图
程序加密与解密的效果
例1
加密的过程
你要用超撒密码加密还是解密?(0加密,非0解密) -> 0
请输入你要用超撒密码加密的字符串(不能有控制字符) -> 1+1=2
左边的干扰字符要多少长度?(正整数) -> 1
右边的干扰字符要多少长度?(正整数) -> 2
加密之后的字符串与密钥
密钥:Dz#4f
加密之后的字符串 -> jU&4Qx?H
例2
解密的过程
你要用超撒密码加密还是解密?(0加密,非0解密) -> 1
请输入你要用超撒密码解密的字符串(不能有控制字符) -> jU&4Qx?H
左边的干扰字符有多少长度?(正整数) -> 1
右边的干扰字符有多少长度?(正整数) -> 2
密钥为多少? -> Dz#4f
解密之后的字符串
解密之后的字符串 -> 1+1=2
例3
加密的过程
你要用超撒密码加密还是解密?(0加密,非0解密) -> 0
请输入你要用超撒密码加密的字符串(不能有控制字符) -> SuperSa
左边的干扰字符要多少长度?(正整数) -> 5
右边的干扰字符要多少长度?(正整数) -> 5
加密之后的字符串与密钥
密钥:>%-Ac’h
加密之后的字符串 -> ut47Yqz}'VZJm8K>*
超撒密码的优点与缺点
优点
- 可以增加能干扰人的字符,从而让破解这种密码的人会多破解几次,并且拖延了破解这种密码的人的时间
- 用超撒密码加密过后的字符串的长度越长,安全性就越高,被破解的几率也就越小。
- 不能使用频率分析或者样式单词分析来轻松地解密用超撒密码加密过后的字符串,因为把一个字符串用超撒密码加密过后,这个字符串本身的所有字符就都被用密钥为随机值的凯撒密码加密了
- 把用超撒密码加密过后的字符串再用超撒密码解密之后,如果密钥错误,就有可能解密出一个相当正常但却不与原来的字符串相同的结果了,例如把
"str"
在左边的干扰字符和右边的干扰字符的个数都为0的情况下加密成y'r
,密钥为&2
,这是,如果把要解密的字符串y'r
,左边的干扰字符和右边的干扰字符的个数和密钥&2
都用来解密的话,就解密成原来的字符串str
了,如果在这之中,密钥为6E
,就解密成与原来的字符串毫不相关的字符串car
了
缺点
用超撒密码加密过后的字符串的长度如果越长,那密钥就越不能容易记进脑子里面去
结尾
在你看到这里之后,可以评论来互动一下我哦。