您好我想用c ++中的blowfish加密文件,但它根本不起作用。我只从加密中获得相同的内容。有人可以帮助我吗?
char * memblock;
long size;
printf("init params");
ifstream file ("/encryptfile.txt", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char [size];
file.seekg (0, ios::beg);
printf("init all of it");
file.read (memblock, size);
printf("read file");
}
else printf("Unable to open file");
long multipleSize = (size/8 +1)*8;
long paddingSize = size * multipleSize;
char * outMemBlock;
outMemBlock = new char[paddingSize];
memset(outMemBlock, 0, paddingSize);
CBlowFish objBlowFish((unsigned char*)"abcdefgh",8);
printf("make blowfish file");
objBlowFish.Encrypt((unsigned char*)memblock,(unsigned char*)outMemBlock,16000);
printf("encryption done");
ofstream myfile ("/encryptfile.txt");
if (myfile.is_open())
{
myfile << outMemBlock;
myfile.close();
}
else cout << "Unable to open file";
答案 0 :(得分:0)
您似乎正在使用ECB模式,这是description的默认模式(假设我们正在谈论相同的库):
void Encrypt(unsigned char* buf, size_t n, int iMode=ECB);
void Decrypt(unsigned char* buf, size_t n, int iMode=ECB);
同一页面上也有描述:
Encrypt()
函数的第一个变体用于应用指定操作模式的指定大小的数据块的就地加密。块大小应为8的倍数。此功能可以在以下模式下运行:ECB,CBC或CFB。在ECB模式下,不使用链接。如果使用相同的密钥对同一块加密两次,则生成的密文块是相同的。
所以你应该使用CBC或CFB模式,并在构造函数中提供随机IV(初始链接值称为roChain
):
CBlowFish(unsigned char* ucKey, size_t n, const SBlock& roChain = SBlock(0UL,0UL));
通常,IV以密文为前缀并且检索到&amp;在解密之前跳过。