简单加密入门-附加c语言代码实现

今天,小编来讲解一下最最最最最基础的一些字符串加密,对于一些刚刚入门的同学来说,加密和解密一串密文还是有些难度的,而对于网络上MD5,希哈加密等又对初学者有些复杂,这里,我给出了几种十分简单的加密方式,不过这不是用来使密码更加安全,而是为了在生活中让传信的中间人不容易直接看出你的明文,以保证在短时间内能够让你的信息通过中间人送到接收者手中(再重声一边,这不是密码加密,并不能防止信息泄漏,任何懂一点密码的人都能通过字母出现率来复原出明文)

另外此文章只能作为参考,这些加密方法的加强版小编希望新手能够自己探索,所以这里只给出几个idea

1.摩尔斯电码,曾经十分流行,原理十分简单,就是把每个字符替换成相应的由‘.‘,’-‘组成的一个对应字符串。由于密文只有两种字符,可以使用0和1代替’.’,‘-’
具体可以找百度百科
下面给出c语言加密方法

#include <bits/stdc++.h>  
#include<cstdio>
using namespace std;

int main()
{
	string s;
	getline (cin,s);
	for(int i=0;i<=s.size();i++)
	{
		if(s[i]<='z'&&s[i]>='a'||s[i]>='A'&&s[i]<='Z')
		{
			if(s[i]=='a'||s[i]=='A')cout<<".-/ ";
			else if(s[i]=='b'||s[i]=='B')cout<<"-.../ ";
			else if(s[i]=='c'||s[i]=='C')cout<<"-.-./ ";
			else if(s[i]=='d'||s[i]=='D')cout<<"-../ ";
			else if(s[i]=='e'||s[i]=='E')cout<<"./ ";
			else if(s[i]=='f'||s[i]=='F')cout<<"..-./ ";
			else if(s[i]=='g'||s[i]=='G')cout<<"--./ ";
			else if(s[i]=='h'||s[i]=='H')cout<<"..../ ";
			else if(s[i]=='i'||s[i]=='I')cout<<"../ ";
			else if(s[i]=='j'||s[i]=='J')cout<<".---/ ";
			else if(s[i]=='k'||s[i]=='K')cout<<"-.-/ ";
			else if(s[i]=='l'||s[i]=='L')cout<<".-../ ";
			else if(s[i]=='m'||s[i]=='M')cout<<"--/ ";
			else if(s[i]=='n'||s[i]=='N')cout<<"-./ ";
			else if(s[i]=='o'||s[i]=='O')cout<<"---/ ";
			else if(s[i]=='p'||s[i]=='P')cout<<".--./ ";
			else if(s[i]=='q'||s[i]=='Q')cout<<"--.-/ ";
			else if(s[i]=='r'||s[i]=='R')cout<<".-./ ";
			else if(s[i]=='s'||s[i]=='S')cout<<".../ ";
			else if(s[i]=='t'||s[i]=='T')cout<<"-/ ";
			else if(s[i]=='u'||s[i]=='U')cout<<"..-/ ";
			else if(s[i]=='v'||s[i]=='V')cout<<"...-/ ";
			else if(s[i]=='w'||s[i]=='W')cout<<".--/ ";
			else if(s[i]=='x'||s[i]=='X')cout<<"-..-/ ";
			else if(s[i]=='y'||s[i]=='Y')cout<<"-.--/ ";
			else if(s[i]=='z'||s[i]=='Z')cout<<"--../ ";
			
		}
		else if(s[i]>='0'&&s[i]<='9')
		{
			if (s[i]=='1')cout<<".----/ ";
			if (s[i]=='2')cout<<"..---/ ";
			if (s[i]=='3')cout<<"...--/ ";
			if (s[i]=='4')cout<<"....-/ ";
			if (s[i]=='5')cout<<"...../ ";
			if (s[i]=='6')cout<<"-..../ ";
			if (s[i]=='7')cout<<"--.../ ";
			if (s[i]=='8')cout<<"---../ ";
			if (s[i]=='9')cout<<"----./ ";
			if (s[i]=='0')cout<<"-----/ ";
		}
		else	if(s[i]==' ')cout<<"-.--.-/ ";
		else	if(s[i]==',')cout<<"--..--/ ";
		else	if(s[i]=='.')cout<<".-.-.-/ ";
		else	if(s[i]=='!')cout<<"-.-.--/ ";
		else	if(s[i]=='?')cout<<"..--../ ";
		else 	cout<<"<error>/ ";
	}
	cout <<endl<<"---------------------"<<endl;
	system("pause");
	return 0;
}

代码原理太过简单,这里不再阐述

下面是解密

#include<iostream> 
using namespace std;

int main()
{
	string ss;
	getline(cin,ss);
	
	int i=0;
	string s;
	while(i<=ss.size())
	{
		if(ss[i]!='/'){
			s+=ss[i];
			i++;
			continue;
		}
		else { 
			s+="/";
		    if(s==".-/")cout<<'a';
			else if(s=="-.../")cout<<'b';
			else if(s=="-.-./")cout<<'c';
			else if(s=="-../")cout<<'d';
			else if(s=="./")cout<<'e';
			else if(s=="..-./")cout<<'f';
			else if(s=="--./")cout<<'g';
			else if(s=="..../")cout<<'h';
			else if(s=="../")cout<<'i';
			else if(s==".---/")cout<<'j';
			else if(s=="-.-/")cout<<'k';
			else if(s==".-../")cout<<'l';
			else if(s=="--/")cout<<'m';
			else if(s=="-./")cout<<'n';
			else if(s=="---/")cout<<'o';
			else if(s==".--./")cout<<'p';
			else if(s=="--.-/")cout<<'q';
			else if(s==".-./")cout<<'r';
			else if(s==".../")cout<<'s';
			else if(s=="-/")cout<<'t';
			else if(s=="..-/")cout<<'u';
			else if(s=="...-/")cout<<'v';
			else if(s==".--/")cout<<'w';
			else if(s=="-..-/")cout<<'x';
			else if(s=="-.--/")cout<<'y';
			else if(s=="--../")cout<<'z';
			
	        else if(s==".----/")cout<<'1';	    
	        else if(s=="..---/")cout<<'2';	
	        else if(s=="...--/")cout<<'3';	
	        else if(s=="....-/")cout<<'4';	
	        else if(s=="...../")cout<<'5';	
	        else if(s=="-..../")cout<<'6';	
	        else if(s=="--.../")cout<<'7';	    
	        else if(s=="---../")cout<<'8';	
	        else if(s=="----./")cout<<'9';	
	        else if(s=="-----/")cout<<'0';
				
	        else if(s=="-.--.-/")cout<<' ';	
	        else if(s=="--..--/")cout<<',';	    
	        else if(s==".-.-.-/")cout<<'.';	
	        else if(s=="-.-.--/")cout<<'!';	
			else if(s=="..--../")cout<<'?';	
			else cout<<"<error>";
			s="";
		}
   		i++;
	}
	cout <<endl;
	cout <<"-------------------------------------"<<endl;
	cout <<endl;
	system("pause");
	return 0;
}

在运用摩尔斯电码的时候会发现必须要使用‘/’来区分两个字符这个在解密的时候格式需要正确,有兴趣可以自己尝试改变加密后的格式,使其更容易辨认

2.这个是一个非常经典的加密方式,就是将每个字符对应的密文往后移一个,比如说a用b代替,b用c代替,以此类推,而由于把所有字符向后移一位,所以密钥为1.密钥在这里是解密的关键,需要接收者在接受密文以前就知道密钥,而密钥在这里最多有25种加密状况,只要全部试一下就破译出来了,所以很少人会用

下面给出加密代码

#include <bits/stdc++.h>//密钥:1 
using namespace std;
char a[80];
int i=0,l;
int main()
{
	gets(a);
	l=strlen(a);
	for(i=0;i<l;i++)
	{
	if(a[i]=='Z'||a[i]=='z')
	    a[i]=a[i]-25;
	else 
	    if(a[i]>='a'&&a[i]<'z'||a[i]>='A'&&a[i]<'Z')
			a[i]=a[i]+1;
	cout<<a[i];
	}
	cout<<endl<<"----------------"<<endl;
	system("pause");
return 0; 
	}

一下是解密代码

#include<iostream>
#include<cstring>
#include <cstdio>
char s[201];
using namespace std;
int main()
{
	gets(s);
	for(int i=0;i<strlen(s);++i)
	{
	if(s[i]>='A'&&s[i]<='Z'||s[i]>='a'&&s[i]<='z')
        {
          if(s[i]>='a'&&s[i]<'b'||s[i]>='A'&&s[i]<'B')
              s[i]+=25;
          else
              s[i]-=1;
        }
    }
 cout<<s;
 cout<<endl<<"----------------"<<endl;
 
 system("pause");
 return 0;
 }

代码原理太过简单,这里不再阐述

3.这种密码是第二种密码的变换,主要是将每个字母能对应的密文做成表,这样每个字母都有自己的对应密文,并且对应表可以是随机,所以降低被破解的可能,这种情况下,可能出现的密码表共有25!种,相对安全很多。
这里小编没有给出代码,理解了原理之后,我希望能够自己写出代码

这种密码的解密相对复杂一点,需要通过每个字母出现的频率来发现那个字母对应哪个密文。比如e是出现率最高的,所以如果一个字母在密文中出现频率非常高就很有可能是e,以此类推,最终破译字符串。所以正常来讲可以尝试自己手写破译

下面给出一道题目,可以在留言区回答,请大佬略过,如果以上信息有误,请在留言区纠正,谢谢

Decrypt the following text qoymlNlpY :ccdf lpy yzJ .qoh ln lxigqoh qlxlm eeiw zot ydpy gmipylnoC ,zot gmiyqdncyzo ho ydpy ci lniqk tN .lsie sooe tlpy ydpw yom ,smipy amd tdc tlpy ydpw tj lefolf gmigazb ho ydpy ci lniqk tN .tyicoiqzk ho ydpy ci lniqk tN .edminiqk d nd i clT

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单实现SHA-1算法加密C语言代码: ```c #include <stdio.h> #include <stdint.h> #include <string.h> #define ROTL(x,n) (((x) << (n)) | ((x) >> (32 - (n)))) void sha1(uint8_t* message, uint32_t message_len, uint8_t* digest) { uint32_t H[5] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }; uint32_t K[4] = { 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 }; uint32_t W[80]; uint32_t A, B, C, D, E, temp; uint32_t i, j; // padding message uint64_t bit_len = message_len * 8; uint32_t pad_len = (bit_len % 512 < 448) ? 512 - bit_len % 512 : 1024 - bit_len % 512; uint32_t block_len = (bit_len + pad_len + 64) / 32; uint32_t* block = (uint32_t*) malloc(block_len * sizeof(uint32_t)); memcpy(block, message, message_len); block[message_len / 4] |= 0x80 << (24 - message_len % 4 * 8); for (i = message_len / 4 + 1; i < block_len - 2; i++) { block[i] = 0; } block[block_len - 2] = bit_len >> 32; block[block_len - 1] = bit_len & 0xFFFFFFFF; // update hash for (i = 0; i < block_len; i += 16) { for (j = 0; j < 16; j++) { W[j] = block[i + j]; } for (j = 16; j < 80; j++) { W[j] = ROTL(W[j - 3] ^ W[j - 8] ^ W[j - 14] ^ W[j - 16], 1); } A = H[0]; B = H[1]; C = H[2]; D = H[3]; E = H[4]; for (j = 0; j < 80; j++) { if (j < 20) { temp = ROTL(A, 5) + ((B & C) | ((~B) & D)) + E + W[j] + K[0]; } else if (j < 40) { temp = ROTL(A, 5) + (B ^ C ^ D) + E + W[j] + K[1]; } else if (j < 60) { temp = ROTL(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[j] + K[2]; } else { temp = ROTL(A, 5) + (B ^ C ^ D) + E + W[j] + K[3]; } E = D; D = C; C = ROTL(B, 30); B = A; A = temp; } H[0] += A; H[1] += B; H[2] += C; H[3] += D; H[4] += E; } free(block); // output digest for (i = 0; i < 5; i++) { digest[i * 4] = (uint8_t)(H[i] >> 24); digest[i * 4 + 1] = (uint8_t)(H[i] >> 16); digest[i * 4 + 2] = (uint8_t)(H[i] >> 8); digest[i * 4 + 3] = (uint8_t)(H[i]); } } int main() { uint8_t message[] = "hello world"; uint8_t digest[20]; sha1(message, strlen(message), digest); printf("SHA-1 digest: "); for (int i = 0; i < 20; i++) { printf("%02x", digest[i]); } printf("\n"); return 0; } ``` 注意,这个实现仅供学习和参考,不应该用于实际应用中。在实际应用中,应该使用经过充分测试和验证的加密库来保证安全性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值