、自己设计并实现一套口令加密算法,用c++语言实现。 4、自己设计一套防止通过抓包获得原始口令的策略。
时间: 2023-05-26 12:03:49 浏览: 119
1. 口令加密算法设计
基于传统密码学中的置换和替换技术,可以设计一种简单的口令加密算法。具体步骤如下:
1. 明文口令转化加密key:将明文口令转化为一个加密key。可以使用MD5等散列函数对明文口令进行哈希,得到一个128位的加密key。
2. 置换:对于明文口令的每个字符,将其根据一定的规则进行位置上的置换。比如,可以将第i个字符置换为第(i+3)个字符(循环置换),或者将第i个字符置换为第i+奇偶性个字符(奇偶性置换)。
3. 替换:对于置换后的口令字符串,可以将其中的某些字符进行替换。可以使用简单的替换表,如'A'替换为'*','B'替换为'@'等等。
4. 输出密文:将置换替换后的字符串与加密key进行异或运算得到密文。
2. 口令加密算法实现
下面是基于上述设计思路的C语言口令加密算法实现。其中,使用了MD5库进行密码哈希。
``` c
#include <stdio.h>
#include <string.h>
#include "md5.h"
#define KEY_LEN 128 // 加密key长度,单位为bit
char* encrypt(char* plain); // 加密函数
int main() {
char plain[100]; // 明文口令
printf("Please enter your password: ");
scanf("%s", plain);
char* cipher = encrypt(plain); // 加密
printf("Cipher: %s\n", cipher);
free(cipher);
return 0;
}
char* encrypt(char* plain) {
int len = strlen(plain);
int key[KEY_LEN];
memset(key, 0, sizeof(key));
// 计算加密key
md5_state_t state;
md5_byte_t digest[16];
md5_init(&state);
md5_append(&state, (const md5_byte_t*)plain, len);
md5_finish(&state, digest);
for (int i = 0; i < 16; ++i) {
for (int j = 0; j < 8; ++j) {
key[i * 8 + j] = (digest[i] >> j) & 1;
}
}
// 置换
char* swapped = (char*)malloc((len+1) * sizeof(char));
for (int i = 0; i < len; ++i) {
swapped[(i+3) % len] = plain[i]; // 循环置换
}
swapped[len] = '\0';
// 替换(简单替换表)
char* replaced = (char*)malloc((len+1) * sizeof(char));
for (int i = 0; i < len; ++i) {
switch (swapped[i]) {
case 'A': replaced[i] = '*'; break;
case 'B': replaced[i] = '@'; break;
default: replaced[i] = swapped[i];
}
}
replaced[len] = '\0';
// 异或
char* cipher = (char*)malloc((len+1) * sizeof(char));
for (int i = 0; i < len; ++i) {
cipher[i] = replaced[i] ^ key[i%KEY_LEN];
}
cipher[len] = '\0';
free(swapped);
free(replaced);
return cipher;
}
```
3. 防抓包策略设计
在网络传输中,即便使用了加密算法对口令进行加密,仍然可能被中间人攻击者通过抓包的方式获取到明文口令。为了解决这个问题,可以采用以下的一些策略:
1. 加入时间戳:在输入密码时,将密码和当前时间一起发送给服务器。服务器端记录这个时间戳,并且在接收到客户端传来的密码之后,立即重算一遍哈希值。因为时间戳是变化的,所以攻击者即便截获了一条密码传输数据,也不能反复使用,再次发起攻击。
2. 使用多重哈希:将用户输入的密码作为sha1的输入参数,然后将哈希得到的128位结果再次进行md5哈希,最终得到一个32位的哈希结果。将这个哈希结果用于认证,这样即便攻击者截取了认证请求数据,也无法直接得到用户的密码,只能得到哈希结果。
3. 直接使用证书:将用户的密码转化为证书或者私钥,只有通过这个证书或者私钥才能完成认证。这种方法类似于一次性密码,即便攻击者截取了传输数据,也无法利用其中的密码,只能获取到证书或者私钥。
4. 建立安全通道:利用SSL/TLS等协议建立安全的通道,这样传输过程中的信息都进行了隧道加密,攻击者无法获取明文信息。
以上策略并不是绝对安全,只是一些基本的防范手段,并不能保证百分之百的防止口令抓取攻击。在实际应用中,还需要根据具体场景设计更加细致的安全方案。
阅读全文