加解密算法实践之栅栏密码
【摘要】 栅栏密码是一种简单的移动字符位置的加密方法,规则简单,容易破解。栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文1,再取每组第二个字连起来得到密文2……最后把密文1、密文2……连成整段密文。(一)矩形对角线法长: M(6-12)宽:N(3-6)按对角线排列明文:按行生成密文。def crypto(): plain = input('请输入明文:') ...
栅栏密码是一种简单的移动字符位置的加密方法,规则简单,容易破解。栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文1,再取每组第二个字连起来得到密文2……最后把密文1、密文2……连成整段密文。
(一)矩形对角线法
长: M(6-12)
宽:N(3-6)
按对角线排列明文:按行生成密文。
def crypto():
plain = input('请输入明文:')
n = int(input('请输入每组字数:'))
ans = ''
for i in range(n):
for j in range(int(plain.__len__()/n + 0.5)):
try:
ans += plain[j*n+i]
except:
pass
return ans
def decrypto():
plain = input('输入密文:')
for n in range(2,plain.__len__()-1):
ans = ''
for i in range(n):
for j in range(int(plain.__len__() / n + 0.5)):
try:
ans += plain[j * n + i]
except:
pass
print(ans)
if __name__ == '__main__':
print('SM-栅栏密码加密/解密.py')
while(True):
choice = input('请选择功能:\n1:加密\n2:解密\n')
# 加密
if choice == '1':
print(crypto())
# 解密
elif choice == '2':
decrypto()
else:
print('choice error!')
(二)三角形法
长: M(7,9,11,13,15)宽:N(3-6)
按行排列明文,按列生成密文:
编写程序,完成加密和
解密功能。
原文信息只包含字母,原文和密文长度相等。
#include "stdio.h"
#include "string.h"
#include <math.h>
#define trig_long 7
#define trig_wide 4
int a[20][20];
int i,j,len=0,len2, count=0, fill_len;
char passwd[20] = {0};
char passwd2[20] = {0};
void passwd_fill(void);
void passwd_fill2(void);
void triangle_show();
void enpasswd(void);
void passwd_encrypt(void);
void passwd_decryption(void);
int main(int argc, char *argv[])
{
if(strcmp(argv[1], "1")==0)
{
strcpy(passwd, argv[2]);
passwd_encrypt();
}
else if(strcmp(argv[1], "2")==0)
{
strcpy(passwd, argv[2]);
passwd_decryption();
}
return 0;
}
void passwd_encrypt(void)
{
printf("\n->Began to encrypt......\n");
len = strlen(passwd);
printf("->string len:%d\n", len);
printf("->trig_long:%d\n->trig_wide:%d\n",trig_long, trig_wide);
if(trig_long>=(2*trig_wide-1))
{
fill_len = trig_wide*trig_wide;
}
else
{
fill_len = (trig_long+1)*(trig_long+1)/4;
}
if(len > fill_len)
{
printf("ERROR");
return;
}
passwd_fill();
triangle_show();
enpasswd();
}
void passwd_decryption(void)
{
passwd_fill2();
}
void passwd_fill(void)
{
count = 0;
for(i=0; i<trig_wide; i++)
{
for(j=0; j<(trig_wide-i); j++)
{
a[i][j] = '\0';
}
for(j=0; j<(i*2+1); j++)
{
a[i][3-i+j] = passwd[count++];
if(count==len)
{
return;
}
}
}
}
void triangle_show()
{
fputc('\n', stdout);
for(i=0; i<trig_wide; i++)
{
for(j=0; j<((trig_long+1)/2+i); j++)
{
if(a[i][j]=='\0')
{
fputc(' ', stdout);
}
else
{
printf("%c", a[i][j]);
}
}
fputc('\n', stdout);
}
fputc('\n', stdout);
}
void enpasswd(void)
{
count = 0;
for(i=0; i<trig_long; i++)
{
for(j=0; j<trig_wide; j++)
{
if(a[j][i]!='\0')
{
passwd2[count++] = a[j][i];
}
}
}
printf("->finish encrypt!!!!!!\n");
printf("->password:%s\n->password len:%ld\n", passwd2, strlen(passwd2));
}
void passwd_fill2(void)
{
int w,l;
int t;
len = strlen(passwd);
t = sqrt(len);
if(t*t != len)
{
for(i=len-1; i<((t+1)*(t+1)); i++)
{
passwd[i] = ' ';
}
}
printf("passwd:%s,len:%ld\n", passwd, strlen(passwd));
w = t;
l = 2*t-1;
printf("w:%d, l:%d\n", w,l);
for(i=0; i<((l+1)/2); i++)
{
for(j=0; j<w-i-1; j++)
{
a[j][i] = ' ';
}
for(j=w-i-1; j<w; j++)
{
a[j][i] = passwd[count++];
}
}
for(i=0; i<(l+1)/2-1; i++)
{
for(j=0; j<i+1; j++)
{
a[j][i+(l+1)/2] = ' ';
}
for(j=i+1; j<w; j++)
{
a[j][i+(l+1)/2] = passwd[count++];
}
}
count = 0;
fputc('\n', stdout);
for(i=0; i<w; i++)
{
for(j=0; j<l; j++)
{
printf("%c", a[i][j]);
if(a[i][j]!=' ')
{
passwd2[count++] = a[i][j];
}
}
fputc('\n', stdout);
}
fputc('\n', stdout);
printf("string:%s, len:%ld\n", passwd2, strlen(passwd2));
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)