加密不定长数据 且 加密前数据和加密后数据大小相等,
2. 想实现的功能是加密不定长的数据, 而且加密后的数据和原始数据一样大
求个能实现的算法, 求简单的, 本人基本上学过过算法
3. 比如加密下面这20个字节数据, 数据就被加密成32个字节的数据, 数据变大了
BYTE byIn[20 = {
'\x11' ,'\x22' ,'\x33' ,'\x44' ,'\x55' ,'\x66' ,'\x77' ,'\x88' ,
'\x99' ,'\xAA' ,'\x00' ,'\xCC' ,'\xDD' ,'\xEE' ,'\xFF' ,'\x00' ,
'\x45' ,'\x4A' ,'\x05' ,'\x8C' //加密之后变成了16个字节的加密数据
};
4. 下面是代码, 解密之后最后一块数据<20个字节的后4个字节不对了>, 因为AES是按照16个字节加密解密的
#include "stdafx.h"
#include <openssl/ssl.h>
#include <openssl/aes.h>
#include <openssl/rsa.h>
#include <openssl/rc4.h>
#include <string>
#include <iostream>
#include <fstream>
#include <PeClass.h>
using std::string;
//AES加密是以每组16个字节加密的
//AES加密(加密后数据, 加密前数据, 大小, 密钥)
void AesEncryption(OUT BYTE* bOutData, IN BYTE* bInData, IN DWORD dwSizeOut, OUT string strKey)
{
DWORD dwSize = Align(dwSizeOut, 16);
//new一片0x16对齐后的空间
BYTE* byNewIn = new BYTE[dwSize]();
memcpy(byNewIn, bInData, dwSizeOut);
//计算加密的次数
DWORD dwAlignNum = dwSizeOut / 16;
//最后一块剩余字节数
DWORD dwRemain = dwSizeOut % 16 ;
if (dwRemain)
{
++dwAlignNum;;
}
unsigned char aes_keybuf[32] = { 0 };
//memset(aes_keybuf,0,sizeof(aes_keybuf));
//将密钥复制到aes_keybuf
strcpy((char *)aes_keybuf, strKey.c_str());
//把明文密钥加密处理
AES_KEY aeskey;
AES_set_encrypt_key(aes_keybuf, 256, &aeskey);
//new一片0x16对齐后的空间
BYTE* byNewOut = new BYTE[dwSize]();
for (DWORD i = 0; i < dwAlignNum; i++)
{
AES_encrypt((const unsigned char *) ((DWORD)byNewIn + i * 16),
(unsigned char *) ((DWORD)byNewOut + i * 16),
&aeskey);
}
//把实际加密后数据, 复制到输出缓冲区
memcpy(bOutData, byNewOut, dwSizeOut);
delete byNewOut;
delete byNewIn;
}
//AES解密(解密后数据, 解密前数据, 大小, 密钥)
void AesDecryption(OUT BYTE* bOutData, IN BYTE* bInData, IN DWORD dwSizeOut, OUT string strKey)
{
DWORD dwSize = Align(dwSizeOut, 16);
//new一片0x16对齐后的空间
BYTE* byNewIn = new BYTE[dwSize]();
memcpy(byNewIn, bInData, dwSizeOut);
//计算加密的次数
DWORD dwAlignNum = dwSizeOut / 16;
//最后一块剩余字节数
DWORD dwRemain = dwSizeOut % 16;
if (dwRemain)
{
++dwAlignNum;;
}
unsigned char aes_keybuf[32] = { 0 };
//memset(aes_keybuf,0,sizeof(aes_keybuf));
//将密钥复制到aes_keybuf
strcpy((char *)aes_keybuf, strKey.c_str());
//把明文密钥加密处理
AES_KEY aeskey;
AES_set_decrypt_key(aes_keybuf, 256, &aeskey);
//new一片0x16对齐后的空间
BYTE* byNewOut = new BYTE[dwSize]();
for (DWORD i = 0; i < dwAlignNum; i++)
{
AES_decrypt((const unsigned char *)((DWORD)byNewIn + i * 16),
(unsigned char *)((DWORD)byNewOut + i * 16),
&aeskey);
}
//把实际加密后数据, 复制到输出缓冲区
memcpy(bOutData, byNewOut, dwSizeOut);
delete byNewOut;
delete byNewIn;
}
BYTE byIn[20] = {
'\x11' ,'\x22' ,'\x33' ,'\x44' ,'\x55' ,'\x66' ,'\x77' ,'\x88' ,
'\x99' ,'\xAA' ,'\x00' ,'\xCC' ,'\xDD' ,'\xEE' ,'\xFF' ,'\x00' ,
'\x45' ,'\x4A' ,'\x05' ,'\x8C'
};
int main(void) {
//BYTE byIn[20] = {};
BYTE byOut[20] = {};
BYTE byBuf[20] = {};
AesEncryption(byOut, byIn, 20, "123456");
AesDecryption(byBuf, byOut, 20, "123456");
return 0;
}
相关推荐
RC4算法C语言实现
RC4加密算法Ron Rivest(非常有名的非对称加密算法RSA三巨头之一)在1987年设计的,密钥长度可变的流加密算法簇。之所以称其为簇,是由于其核心部分的S-box长度可为任意,但一般为256字节。该算法的速度可以达到DES加密的10倍左右,且具有很高级别的非线性。RC4起初是用于保护商业机密的。但是在1994年9月,它的算法被发布在互联网上,也就不再有什么商业机密了。RC4也被叫做ARC4(Alleged RC4——所谓的RC4),因为RSA从来就没有正式发布过这个算法。 备注:RC4是对称密钥加密算法,而RSA是非对称的加密算法。由于RC4算法加密是采用的xor,所以,一旦子密钥序列出现了重复,密文就有可能被破解。那么,RC4算法生成的子密钥序列是否会出现重复呢?由于存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,推荐在使用RC4算法时,必须对加密密钥进行测试,判断其是否为弱密钥。根据目前的分析结果,没有任何的分析对于密钥长度达到128位的RC4有效,所以,RC4是目前最安全的加密算法之一。
掌握RC4与AES加密算法的实现与应用
本文还有配套的精品资源,点击获取 简介:加密算法在保护信息安全方面至关重要。本话题介绍两种广泛使用的加密算法:RC4和AES。RC4是一种流加密算法,以速度和简单实现著称,但其安全性已受质疑。AES是现代加密标准,提供多级安全性和灵活性,广泛应用于多种场景。通过学习这两种算法,开发者可以为不同应用场景选择合适的加密方案,以保障数据安全。 1. RC4加密算法的原理和实...
java实现的RC4加密解密算法示例
主要介绍了java实现的RC4加密解密算法,结合具体实例形式分析了java RC4加密解密算法的实现与使用技巧,需要的朋友可以参考下
实验3 C语言实现RC4加密算法报告
1、实现RC4对任意文件的加解密(命令行方式) 加解密形式如下: RC4 -e/-d key inputfile outputfile 说明:对于加密来说,输入文件名就是明文文件,对于解密来说,输入文件名就是密文文件,注意文件读取方式和控制文件结束。 控制台编程: int main(int argc, char *argv[ ])
RSA、AES、RC4、ECC等加密算法性能分析
本demo用C# 实现了了AES、RSA、DES、RC4、ECC加密解密方法,同时分析了几个加密解密的性能 其中用来加密的源字符串为随机生成的10字节 1KB,10KB 100KB的字符串


模式及实现
