设计并实现一套口令加密算法,用c++语言实现
时间: 2023-05-23 07:04:45 浏览: 186
A:好的,我来为您设计一套口令加密算法,基于哈希函数的原理实现。
1. 输入口令:用户输入需要加密的密码。
2. 加密过程:
a. 选择一种哈希函数,如MD5、SHA1等,对口令进行哈希运算。
b. 对哈希值进行加盐处理,即在哈希值中加入一段随机的字符串,增加破解难度。
c. 再次进行哈希运算,得到最终的加密结果。
3. 输出加密结果:将最终的加密结果返回给用户存储于数据库中。
4. 解密过程与一般的加密算法不同,并不是将加密结果重新还原为明文,而是将用户输入的密码进行相同的哈希运算、加盐处理和哈希运算,得到一个与加密结果相同的哈希值,然后将这个哈希值与数据库中存储的哈希值进行比对,如果相同,则密码正确,否则不正确。
5. 实现步骤:
a. 在程序中引入哈希函数库,如openssl等。
b. 编写代码实现加密过程和解密过程。
c. 调试程序,确保加密和解密的正确性。
6. 安全性考虑:
a. 使用强哈希函数,如SHA-256等,增强破解难度。
b. 使用加盐技术,增加破解难度。
c. 对存储在数据库中的加密结果进行加密,以防止非法入侵。
相关问题
、自己设计并实现一套口令加密算法,用c++语言实现。 4、自己设计一套防止通过抓包获得原始口令的策略。
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等协议建立安全的通道,这样传输过程中的信息都进行了隧道加密,攻击者无法获取明文信息。
以上策略并不是绝对安全,只是一些基本的防范手段,并不能保证百分之百的防止口令抓取攻击。在实际应用中,还需要根据具体场景设计更加细致的安全方案。
用c++语言实现一套简单的古典口令加密算法
古典口令加密算法是一种基于替换的加密算法,它使用一个口令作为加密密钥。具体实现如下:
1. 定义一个口令字符串,例如 "password"。
2. 将每个字母对应一个数字,例如 a 对应 1,b 对应 2,c 对应 3,以此类推。
3. 将口令字符串转换为数字序列,例如 "password" 可以转换为 {16, 1, 19, 19, 23, 15, 18, 4}。
4. 定义一个待加密的字符串,例如 "hello world"。
5. 将待加密的字符串中的每个字母对应一个数字,例如 h 对应 8,e 对应 5,l 对应 12,o 对应 15,以此类推。
6. 将待加密的字符串转换为数字序列,例如 "hello world" 可以转换为 {8, 5, 12, 12, 15, 23, 15, 18, 12, 4}。
7. 对于每个数字,用相应的口令数字进行替换,例如 8 替换为 16,5 替换为 1,以此类推。
8. 将替换后的数字序列转换为字符序列,即得到加密后的字符串。
下面是用 C 语言实现古典口令加密算法的代码:
```c
#include <stdio.h>
#include <string.h>
#define PASSWORD "password" // 定义口令字符串
int main() {
char plaintext[100]; // 定义待加密字符串
int len, i, j;
printf("请输入待加密的字符串:");
scanf("%s", plaintext);
len = strlen(plaintext);
printf("加密后的字符串为:");
for (i = 0; i < len; i++) {
int c = plaintext[i] - 'a' + 1; // 获取待加密字符对应的数字
// 使用口令数字进行替换
for (j = 0; j < strlen(PASSWORD); j++) {
if (PASSWORD[j] == 'a' + c - 1) {
c = j + 1;
break;
}
}
printf("%d ", c); // 输出加密后的数字
}
printf("\n");
return 0;
}
```
注意:上述代码只是对待加密字符串中的每个字母进行了替换,没有考虑空格、标点符号等其他字符。如果需要完善,可以在替换前进行字符判断。