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

📄 blowfish.c

📁 Crypto code code source codes nvmjvhmkh,bj L:L::
💻 C
字号:
// Written by Andrew Carter (2008)
#include <stdio.h>
#include <stdlib.h>
#include "../include/blowfish.h"

#define BLOWFISH_F(x) \
	(((ctx->sbox[0][x >> 24] + ctx->sbox[1][(x >> 16) & 0xFF]) \
	^ ctx->sbox[2][(x >> 8) & 0xFF]) + ctx->sbox[3][x & 0xFF])

void blowfish_encryptblock(blowfish_context_t *ctx, unsigned long *hi, unsigned long *lo)
{
	int i, temp;

	for(i = 0; i < 16; i++) {
		*hi ^= ctx->pbox[i];
		*lo ^= BLOWFISH_F(*hi);
		temp = *hi, *hi = *lo, *lo = temp;
	}
	temp = *hi, *hi = *lo, *lo = temp;

	*lo ^= ctx->pbox[16];
	*hi ^= ctx->pbox[17];
}

void blowfish_decryptblock(blowfish_context_t *ctx, unsigned long *hi, unsigned long *lo)
{
	int i, temp;

	for(i = 17; i > 1; i--) {
		*hi ^= ctx->pbox[i];
		*lo ^= BLOWFISH_F(*hi);
		temp = *hi, *hi = *lo, *lo = temp;
	}
	temp = *hi, *hi = *lo, *lo = temp;

	*lo ^= ctx->pbox[1];
	*hi ^= ctx->pbox[0];
}

void blowfish_initiate(blowfish_context_t *ctx, void *keyparam, unsigned int keybytes)
{
	keybytes %= 57;
	unsigned char *key = keyparam;
	int i, j, k;
	unsigned long calc;

	for(i = 0; i < 4; i++)
		memcpy(ctx->sbox[i], ORIG_S[i], sizeof(ORIG_S[i]));

	memcpy(ctx->pbox, ORIG_P, sizeof(ORIG_P));

	if(keybytes) {
		for(i = 0, j = 0; i < 18; i++) {
			for(k = 0, calc = 0; k < 4; k++) {
				calc <<= 8, calc |= key[j++];
				if(j == keybytes)
					j = 0;
			}
			ctx->pbox[i] ^= calc;
		}
	}

	unsigned long hi = 0, lo = 0;

	for(i = 0; i < 18; i += 2) {
		blowfish_encryptblock(ctx, &hi, &lo);
		ctx->pbox[i] = hi;
		ctx->pbox[i + 1] = lo;
	}

	for(i = 0; i < 4; i++) {
		for(j = 0; j < 256; j += 2) {
			blowfish_encryptblock(ctx, &hi, &lo);
			ctx->sbox[i][j] = hi;
			ctx->sbox[i][j + 1] = lo;
		}
	}
}

void blowfish_clean(blowfish_context_t *ctx)
{
	memset(ctx, 0, sizeof(blowfish_context_t));
}

⌨️ 快捷键说明

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