test1密码学基础——对称加密和非对称加密以及MD5

密码学基础

一、信息安全的目标

私密性

完整性

源认证

不可否认性

二、如何保证信息的私密性

加解密的相关术语:

*算法

*密钥

*明文

*密文

 

F(明文+密钥)= 密文

FN(密文+密钥)= 明文

三、加解密算法总共分为两大类:

对称加解密算法:

定义:加解密密钥一致

特征:加解密长度在40~256位之间;加解密速度快(适合加密视频这种大文件);使用简单的数学操作,很容易通过硬件加速;用于大块数据的加密

       缺点:密钥管理是严重问题(窃取或劫持)。

       常见的对称加密算法:DES、3DES、AES

       DES:(数据加密标准)

              广泛使用的对称加解密算法

              固定密钥长度是56位

              算法非常的好,没有任何的漏洞,但由于密钥长度短,容易收到暴力破解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
非对称加密是一种公开密钥加密方式,它使用两个密钥,一个是公开密钥,另一个是私有密钥。公开密钥可以公开给任何人,私有密钥只有密钥持有者才能拥有。使用公开密钥加密的消息只能使用相应的私有密钥进行解密。这种加密方式在安全性上相对对称加密更高,但是由于加密和解密的计算量比较大,因此通常不用于加密大量数据。 下面是一个使用RSA算法实现非对称加密和解密的C语言程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <openssl/rsa.h> #include <openssl/pem.h> #include <openssl/err.h> #define KEY_LENGTH 2048 #define PUB_KEY_FILE "public_key.pem" #define PRI_KEY_FILE "private_key.pem" int generate_key_pair() { RSA *rsa = NULL; FILE *fp = NULL; int ret = 0; // 生成RSA密钥对 rsa = RSA_new(); if (rsa == NULL) { printf("RSA_new failed.\n"); return -1; } BIGNUM *bne = BN_new(); ret = BN_set_word(bne, RSA_F4); if (ret != 1) { printf("BN_set_word failed.\n"); RSA_free(rsa); return -1; } ret = RSA_generate_key_ex(rsa, KEY_LENGTH, bne, NULL); if (ret != 1) { printf("RSA_generate_key_ex failed.\n"); RSA_free(rsa); return -1; } // 保存公钥 fp = fopen(PUB_KEY_FILE, "w"); if (fp == NULL) { printf("open %s failed.\n", PUB_KEY_FILE); RSA_free(rsa); return -1; } ret = PEM_write_RSAPublicKey(fp, rsa); fclose(fp); if (ret != 1) { printf("PEM_write_RSAPublicKey failed.\n"); RSA_free(rsa); return -1; } // 保存私钥 fp = fopen(PRI_KEY_FILE, "w"); if (fp == NULL) { printf("open %s failed.\n", PRI_KEY_FILE); RSA_free(rsa); return -1; } ret = PEM_write_RSAPrivateKey(fp, rsa, NULL, NULL, 0, NULL, NULL); fclose(fp); if (ret != 1) { printf("PEM_write_RSAPrivateKey failed.\n"); RSA_free(rsa); return -1; } RSA_free(rsa); return 0; } int encrypt_data(const char *plain_data, size_t data_len, char *encrypted_data, size_t *encrypted_len) { RSA *rsa = NULL; FILE *fp = NULL; int ret = 0; // 加载公钥 fp = fopen(PUB_KEY_FILE, "r"); if (fp == NULL) { printf("open %s failed.\n", PUB_KEY_FILE); return -1; } rsa = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL); fclose(fp); if (rsa == NULL) { printf("PEM_read_RSAPublicKey failed.\n"); return -1; } // 加密数据 *encrypted_len = RSA_size(rsa); ret = RSA_public_encrypt(data_len, (unsigned char *)plain_data, (unsigned char *)encrypted_data, rsa, RSA_PKCS1_PADDING); RSA_free(rsa); if (ret <= 0) { printf("RSA_public_encrypt failed.\n"); return -1; } return 0; } int decrypt_data(const char *encrypted_data, size_t encrypted_len, char *decrypted_data, size_t *decrypted_len) { RSA *rsa = NULL; FILE *fp = NULL; int ret = 0; // 加载私钥 fp = fopen(PRI_KEY_FILE, "r"); if (fp == NULL) { printf("open %s failed.\n", PRI_KEY_FILE); return -1; } rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL); fclose(fp); if (rsa == NULL) { printf("PEM_read_RSAPrivateKey failed.\n"); return -1; } // 解密数据 *decrypted_len = RSA_size(rsa); ret = RSA_private_decrypt(encrypted_len, (unsigned char *)encrypted_data, (unsigned char *)decrypted_data, rsa, RSA_PKCS1_PADDING); RSA_free(rsa); if (ret <= 0) { printf("RSA_private_decrypt failed.\n"); return -1; } return 0; } int main() { int ret = 0; char plain_data[] = "Hello World!"; size_t data_len = strlen(plain_data); char encrypted_data[KEY_LENGTH / 8] = { 0 }; size_t encrypted_len = 0; char decrypted_data[KEY_LENGTH / 8] = { 0 }; size_t decrypted_len = 0; // 生成RSA密钥对 ret = generate_key_pair(); if (ret != 0) { printf("generate_key_pair failed.\n"); return -1; } // 加密数据 ret = encrypt_data(plain_data, data_len, encrypted_data, &encrypted_len); if (ret != 0) { printf("encrypt_data failed.\n"); return -1; } // 解密数据 ret = decrypt_data(encrypted_data, encrypted_len, decrypted_data, &decrypted_len); if (ret != 0) { printf("decrypt_data failed.\n"); return -1; } // 打印结果 printf("plain_data: %s\n", plain_data); printf("encrypted_data: "); for (size_t i = 0; i < encrypted_len; i++) { printf("%02X ", encrypted_data[i]); } printf("\n"); printf("decrypted_data: %s\n", decrypted_data); return 0; } ``` 这个程序的主要流程如下: 1. 使用RSA_generate_key_ex函数生成RSA密钥对,并将公钥和私钥保存到文件中; 2. 加载公钥并使用RSA_public_encrypt函数加密数据; 3. 加载私钥并使用RSA_private_decrypt函数解密数据。 在编译时需要链接OpenSSL库,使用命令`gcc -o rsa_test rsa_test.c -lssl -lcrypto`即可。注意,程序每次运行都会生成新的RSA密钥对,因此不要在生产环境中使用这个程序,应该使用事先生成好的密钥对。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值