现代密码学使用三——AES-CBC模式加密word文档

1 篇文章 0 订阅
#include <openssl/des.h>
#include<openssl/aes.h>
#include <cstdio>
#include <string.h>
#include <openssl/evp.h>
#include<iostream>
using namespace std;
//DES_CBC加解密
void cryper(unsigned char input[], const char* key)
{
	const_DES_cblock* keystring = (const_DES_cblock*)key;
	DES_key_schedule key_schedule;
	
	DES_cblock ivec;//初始化向量
	memset(ivec, 0, sizeof(ivec));//这条语句是把ivec中所有字节换做字符“0”
	size_t len = (sizeof(input) + 7) / 8 * 8;
	unsigned char* output = (unsigned char*)malloc(len + 1);// 最少给len开辟这么多空间 加入input为1 则给len 8个字节空间,凑够一个分组
	DES_set_key_unchecked(keystring, &key_schedule);	//设置密钥
	DES_cbc_encrypt(input, output, sizeof(input), &key_schedule, &ivec, DES_ENCRYPT);	// 加密密钥:schedule;ivec: 初始化向量;(一般为8个字节0)加密:DES_ENCRYPT
	cout << "加密后的密文:" << endl;// 输出加密后的结果
	for (int i = 0; i < len; ++i) {
		printf("%02x", output[i]);
	}
	cout << "解密后的明文:" << endl;
	memset(ivec, 0, sizeof(ivec));
	DES_cbc_encrypt(output, input, sizeof(output), &key_schedule, &ivec, DES_DECRYPT);// output输入数据 input输出数据;解密:DES_DECRYPT
	cout << input<< endl;
}


//AES_CBC加密
int  Encrypt_File(unsigned char key[], unsigned char iv[])
{
    EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();   //EVP加密上下文环境
    unsigned char out[1024]; //保存密文的缓冲区
    int outl,  count, v;
    unsigned char in[1024];         //保存原文的缓冲区

    FILE* data, * secret;
    //打开待加密文件
     fopen_s(&data,"C:/Users/lele/Desktop/周一下午/实验三/data.docx", "rb");
    if (data == NULL)
    {
        cout << "打开源文件错误" << endl;
        return -1;
    }
    
    //新建保存密文的文件
     fopen_s(&secret,"C:/Users/lele/Desktop/周一下午/实验三/secret.docx", "wb");
    if (secret == NULL)
    {
        cout << "无法创建加密文件" << endl;
        fclose(data);
        return -1;
    }
    //初始化ctx
    EVP_CIPHER_CTX_init(ctx);
    v = EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);//指定加密算法为AES、key和iv
    if (v != 1)
    {
        cout << "初始化错误" << endl;
        return -1;
    }
    //读取原文,加密后后保存到密文文件。
    for (;;)
    {
        count = fread(in, 1, 1024, data);//in为原文的缓冲区;返回值:读或写的记录数,成功时返回的记录数等于参数三
        if (count <= 0)//判断原文读取结束
            break;
        v = EVP_EncryptUpdate(ctx, out, &outl, in, count);//加密,out为密文的缓冲区
        if (v != 1)
        {
            cout << "加密错误" << endl;
            fclose(data);
            fclose(secret);
            EVP_CIPHER_CTX_cleanup(ctx);
            return -1;
        }
        fwrite(out, 1, outl, secret);//保存密文到文件
    }
    //加密结束
    cout << "加密操作完成" << endl;
    fclose(data);
    fclose(secret);
    EVP_CIPHER_CTX_cleanup(ctx);   //清除EVP加密上下文环境
    
    return 0;
}

//AES_CBC解密
int Decrypt_File(unsigned char key[], unsigned char iv[])
{
    EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();   //EVP加密上下文环境
    unsigned char inp[1024 + EVP_MAX_KEY_LENGTH]; //保存解密后明文的缓冲区数组
    int outl, count, v;
    unsigned char out[1024];             //保存密文数据的数组
    FILE* secret, * data2;

    //打开待解密的密文文件
    fopen_s(&secret, "C:/Users/lele/Desktop/周一下午/实验三/secret.docx", "rb");
    if (secret == NULL)
    {
        cout << "打开密文文件错误" << endl;
        return -1;
    }
    //新建解密后的文件
     fopen_s(&data2,"C:/Users/lele/Desktop/周一下午/实验三/data2.docx", "wb");
    if (data2 == NULL)
    {
        cout << "error123!!!" << endl;
        fclose(secret);
        return -1;
    }

    //初始化ctx
    EVP_CIPHER_CTX_init(ctx);
    //设置解密的算法、key和iv
    v = EVP_DecryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);
    if (v != 1)
    {
        cout << "初始化错误" << endl;
        EVP_CIPHER_CTX_cleanup(ctx);
        return -1;
    }
    //循环读取原文,解密后后保存到明文文件。
    for (;;)
    {
        count = fread(out, 1, 1024, secret);
        if (count <= 0)
            break;
        v = EVP_DecryptUpdate(ctx, inp, &outl, out, count);//解密
        if (v != 1)
        {
            cout << "解密错误" << endl;
            fclose(secret);
            fclose(data2);
            EVP_CIPHER_CTX_cleanup(ctx);
            return -1;
        }
        fwrite(inp, 1, outl, data2);//保存明文到文件
    }
    //解密结束
    fclose(secret);
    fclose(data2);
    EVP_CIPHER_CTX_cleanup(ctx);//清除EVP加密上下文环境
    cout << "解密操作完成" << endl;
    return 0;
}

int main(void)
{
    //DES
	unsigned char input[] = "I am liuyaowei";
	char* key;
	key = new char;
	cout << "请输入密钥:" << endl;
	cin >> key;
	cryper(input, key);	
    //AES
   OpenSSL_add_all_algorithms();
    unsigned char key1[EVP_MAX_KEY_LENGTH];  //保存密钥的数组
    unsigned char iv[EVP_MAX_KEY_LENGTH];   //保存初始化向量的数组
    cout << "请输入密钥 key=";  //键盘输入key
    for (int i = 0; i < 24; i++)
        cin >> key1[i];
    for (int i = 0; i < 8; i++)  //键盘输入key
        iv[i] = i;
    Encrypt_File(key1, iv);
    Decrypt_File(key1, iv);
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个使用Java的DES算法实现OFB模式加密的示例代码: ```java import javax.crypto.*; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.util.Arrays; public class DesOFBExample { public static void main(String[] args) throws Exception { String plaintext = "This is a secret message."; byte[] key = "01234567".getBytes(); byte[] iv = "76543210".getBytes(); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); DESKeySpec keySpec = new DESKeySpec(key); SecretKey secretKey = keyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("DES/OFB/NoPadding"); IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); byte[] ciphertext = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8)); System.out.println("Ciphertext: " + new String(ciphertext)); cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); byte[] decrypted = cipher.doFinal(ciphertext); System.out.println("Decrypted: " + new String(decrypted)); } } ``` 在这个例子中,我们使用了Java的DES算法和OFB模式加密和解密一个字符串。我们使用了一个8字节长的密钥和一个8字节长的IV(初始化向量)。我们还使用了NoPadding填充模式,这意味着我们的明文长度必须是8字节的倍数。如果明文长度不是8字节的倍数,需要在明文末尾添加填充字节,以使其长度为8字节的倍数。 请注意,OFB模式加密过程中不需要密文反馈,因此它可以并行操作。OFB模式还具有“自同步”特性,这意味着如果加密过程中发生了错误,只会影响一个密文块,而不会影响整个数据流。 需要注意的是,由于DES算法的安全性已经受到了质疑,因此不建议在实际应用中使用该算法进行加密。如果需要更高级别的安全性,请考虑使用AES等更强大的加密算法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值