⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blowfish.cpp

📁 lots Elliptic curve cryptography codes. Use Visual c++ to compile
💻 CPP
字号:
// blowfish.cpp - written and placed in the public domain by Wei Dai#include "pch.h"#include "blowfish.h"#include "misc.h"NAMESPACE_BEGIN(CryptoPP)void Blowfish::Base::UncheckedSetKey(const byte *key_string, unsigned int keylength, const NameValuePairs &){	AssertValidKeyLength(keylength);	unsigned i, j=0, k;	word32 data, dspace[2] = {0, 0};	memcpy(pbox, p_init, sizeof(p_init));	memcpy(sbox, s_init, sizeof(s_init));	// Xor key string into encryption key vector	for (i=0 ; i<ROUNDS+2 ; ++i)	{		data = 0 ;		for (k=0 ; k<4 ; ++k )			data = (data << 8) | key_string[j++ % keylength];		pbox[i] ^= data;	}	crypt_block(dspace, pbox);	for (i=0; i<ROUNDS; i+=2)		crypt_block(pbox+i, pbox+i+2);	crypt_block(pbox+ROUNDS, sbox);	for (i=0; i<4*256-2; i+=2)		crypt_block(sbox+i, sbox+i+2);	if (!IsForwardTransformation())		for (i=0; i<(ROUNDS+2)/2; i++)			std::swap(pbox[i], pbox[ROUNDS+1-i]);}// this version is only used to make pbox and sboxvoid Blowfish::Base::crypt_block(const word32 in[2], word32 out[2]) const{	word32 left = in[0];	word32 right = in[1];	const word32 *const s=sbox;	const word32 *p=pbox;	left ^= p[0];	for (unsigned i=0; i<ROUNDS/2; i++)	{		right ^= (((s[GETBYTE(left,3)] + s[256+GETBYTE(left,2)])			  ^ s[2*256+GETBYTE(left,1)]) + s[3*256+GETBYTE(left,0)])			  ^ p[2*i+1];		left ^= (((s[GETBYTE(right,3)] + s[256+GETBYTE(right,2)])			 ^ s[2*256+GETBYTE(right,1)]) + s[3*256+GETBYTE(right,0)])			 ^ p[2*i+2];	}	right ^= p[ROUNDS+1];	out[0] = right;	out[1] = left;}void Blowfish::Base::ProcessAndXorBlock(const byte *inBlock, const byte *xorBlock, byte *outBlock) const{	typedef BlockGetAndPut<word32, BigEndian> Block;	word32 left, right;	Block::Get(inBlock)(left)(right);	const word32 *const s=sbox;	const word32 *p=pbox;	left ^= p[0];	for (unsigned i=0; i<ROUNDS/2; i++)	{		right ^= (((s[GETBYTE(left,3)] + s[256+GETBYTE(left,2)])			  ^ s[2*256+GETBYTE(left,1)]) + s[3*256+GETBYTE(left,0)])			  ^ p[2*i+1];		left ^= (((s[GETBYTE(right,3)] + s[256+GETBYTE(right,2)])			 ^ s[2*256+GETBYTE(right,1)]) + s[3*256+GETBYTE(right,0)])			 ^ p[2*i+2];	}	right ^= p[ROUNDS+1];	Block::Put(xorBlock, outBlock)(right)(left);}NAMESPACE_END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -