任务详情
0. 在openEuler(推荐)或Ubuntu或Windows(不推荐)中完成下面任务
1. 使用OpenSSL的命令对你的8位学号(数字)进行加密解密,密钥的前8个字节为你的8位学号,提交过程截图(5')
2. 使用OpenSSL编程对对"你的8位学号(数字)"进行加密解密,提交代码和运行结果截图。(10’)
3. 使用龙脉智能钥匙完成 2的内容,并与OpenSSL的结果进行对比,提交代码和运行结果截图。((10’))
1
2
代码:
#include <stdio.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
int main(void) {
// 初始化变量
unsigned char key[] = "2021112520211125"; // 16字节密钥
unsigned char iv[] = {0}; // 初始化向量全0,实际应用中应随机生成
unsigned char plaintext[] = "20211125"; // 明文
unsigned char ciphertext[1024]; // 密文存储
unsigned char decryptedtext[1024]; // 解密后的文本存储
int decryptedtext_len, ciphertext_len;
// 创建和初始化上下文
EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
// 加密初始化
EVP_EncryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, iv);
// 加密
EVP_EncryptUpdate(ctx, ciphertext, &ciphertext_len, plaintext, sizeof(plaintext));
EVP_EncryptFinal_ex(ctx, ciphertext + ciphertext_len, &decryptedtext_len);
ciphertext_len += decryptedtext_len;
// 清理加密上下文
EVP_CIPHER_CTX_free(ctx);
ctx = EVP_CIPHER_CTX_new();
// 解密初始化
EVP_DecryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, iv);
// 解密
EVP_DecryptUpdate(ctx, decryptedtext, &decryptedtext_len, ciphertext, ciphertext_len);
EVP_DecryptFinal_ex(ctx, decryptedtext + decryptedtext_len, &decryptedtext_len);
decryptedtext_len += decryptedtext_len;
// 清理解密上下文
EVP_CIPHER_CTX_free(ctx);
// 输出结果
printf("Ciphertext is:\n");
for(int i = 0; i < ciphertext_len; i++)
printf("%02x", ciphertext[i]);
printf("\n");
printf("Decrypted text is:\n%s\n", decryptedtext);
return 0;
}