加解密算法实践之栅栏密码

举报
千奇百怪上申大仙 发表于 2023/03/04 21:47:31 2023/03/04
【摘要】 栅栏密码是一种简单的移动字符位置的加密方法,规则简单,容易破解。栅栏密码的加密方式:把文本按照一定的字数分成多个组,取每组第一个字连起来得到密文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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。