📄 sshblowf.c
字号:
ROUND(14); ROUND(13); ROUND(12); ROUND(11); ROUND(10); ROUND(9); ROUND(8); ROUND(7); ROUND(6); ROUND(5); ROUND(4); ROUND(3); ROUND(2); xL ^= P[1]; xR ^= P[0]; output[0] = xR; output[1] = xL;}static void blowfish_lsb_encrypt_cbc(unsigned char *blk, int len, BlowfishContext * ctx){ word32 xL, xR, out[2], iv0, iv1; assert((len & 7) == 0); iv0 = ctx->iv0; iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_LSB_FIRST(blk); xR = GET_32BIT_LSB_FIRST(blk + 4); iv0 ^= xL; iv1 ^= xR; blowfish_encrypt(iv0, iv1, out, ctx); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_LSB_FIRST(blk, iv0); PUT_32BIT_LSB_FIRST(blk + 4, iv1); blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1;}static void blowfish_lsb_decrypt_cbc(unsigned char *blk, int len, BlowfishContext * ctx){ word32 xL, xR, out[2], iv0, iv1; assert((len & 7) == 0); iv0 = ctx->iv0; iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_LSB_FIRST(blk); xR = GET_32BIT_LSB_FIRST(blk + 4); blowfish_decrypt(xL, xR, out, ctx); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_LSB_FIRST(blk, iv0); PUT_32BIT_LSB_FIRST(blk + 4, iv1); iv0 = xL; iv1 = xR; blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1;}static void blowfish_msb_encrypt_cbc(unsigned char *blk, int len, BlowfishContext * ctx){ word32 xL, xR, out[2], iv0, iv1; assert((len & 7) == 0); iv0 = ctx->iv0; iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_MSB_FIRST(blk); xR = GET_32BIT_MSB_FIRST(blk + 4); iv0 ^= xL; iv1 ^= xR; blowfish_encrypt(iv0, iv1, out, ctx); iv0 = out[0]; iv1 = out[1]; PUT_32BIT_MSB_FIRST(blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1;}static void blowfish_msb_decrypt_cbc(unsigned char *blk, int len, BlowfishContext * ctx){ word32 xL, xR, out[2], iv0, iv1; assert((len & 7) == 0); iv0 = ctx->iv0; iv1 = ctx->iv1; while (len > 0) { xL = GET_32BIT_MSB_FIRST(blk); xR = GET_32BIT_MSB_FIRST(blk + 4); blowfish_decrypt(xL, xR, out, ctx); iv0 ^= out[0]; iv1 ^= out[1]; PUT_32BIT_MSB_FIRST(blk, iv0); PUT_32BIT_MSB_FIRST(blk + 4, iv1); iv0 = xL; iv1 = xR; blk += 8; len -= 8; } ctx->iv0 = iv0; ctx->iv1 = iv1;}static void blowfish_setkey(BlowfishContext * ctx, const unsigned char *key, short keybytes){ word32 *S0 = ctx->S0; word32 *S1 = ctx->S1; word32 *S2 = ctx->S2; word32 *S3 = ctx->S3; word32 *P = ctx->P; word32 str[2]; int i; for (i = 0; i < 18; i++) { P[i] = parray[i]; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 0) % keybytes])) << 24; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 1) % keybytes])) << 16; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 2) % keybytes])) << 8; P[i] ^= ((word32) (unsigned char) (key[(i * 4 + 3) % keybytes])); } for (i = 0; i < 256; i++) { S0[i] = sbox0[i]; S1[i] = sbox1[i]; S2[i] = sbox2[i]; S3[i] = sbox3[i]; } str[0] = str[1] = 0; for (i = 0; i < 18; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); P[i] = str[0]; P[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S0[i] = str[0]; S0[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S1[i] = str[0]; S1[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S2[i] = str[0]; S2[i + 1] = str[1]; } for (i = 0; i < 256; i += 2) { blowfish_encrypt(str[0], str[1], str, ctx); S3[i] = str[0]; S3[i + 1] = str[1]; }}/* -- Interface with PuTTY -- */#define SSH_SESSION_KEY_LENGTH 32static void *blowfish_make_context(void){ return snew(BlowfishContext);}static void *blowfish_ssh1_make_context(void){ /* In SSH1, need one key for each direction */ return snewn(2, BlowfishContext);}static void blowfish_free_context(void *handle){ sfree(handle);}static void blowfish_key(void *handle, unsigned char *key){ BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_setkey(ctx, key, 16);}static void blowfish_iv(void *handle, unsigned char *key){ BlowfishContext *ctx = (BlowfishContext *)handle; ctx->iv0 = GET_32BIT_MSB_FIRST(key); ctx->iv1 = GET_32BIT_MSB_FIRST(key + 4);}static void blowfish_sesskey(void *handle, unsigned char *key){ BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_setkey(ctx, key, SSH_SESSION_KEY_LENGTH); ctx->iv0 = 0; ctx->iv1 = 0; ctx[1] = ctx[0]; /* structure copy */}static void blowfish_ssh1_encrypt_blk(void *handle, unsigned char *blk, int len){ BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_lsb_encrypt_cbc(blk, len, ctx);}static void blowfish_ssh1_decrypt_blk(void *handle, unsigned char *blk, int len){ BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_lsb_decrypt_cbc(blk, len, ctx+1);}static void blowfish_ssh2_encrypt_blk(void *handle, unsigned char *blk, int len){ BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_msb_encrypt_cbc(blk, len, ctx);}static void blowfish_ssh2_decrypt_blk(void *handle, unsigned char *blk, int len){ BlowfishContext *ctx = (BlowfishContext *)handle; blowfish_msb_decrypt_cbc(blk, len, ctx);}const struct ssh_cipher ssh_blowfish_ssh1 = { blowfish_ssh1_make_context, blowfish_free_context, blowfish_sesskey, blowfish_ssh1_encrypt_blk, blowfish_ssh1_decrypt_blk, 8, "Blowfish"};static const struct ssh2_cipher ssh_blowfish_ssh2 = { blowfish_make_context, blowfish_free_context, blowfish_iv, blowfish_key, blowfish_ssh2_encrypt_blk, blowfish_ssh2_decrypt_blk, "blowfish-cbc", 8, 128, "Blowfish"};static const struct ssh2_cipher *const blowfish_list[] = { &ssh_blowfish_ssh2};const struct ssh2_ciphers ssh2_blowfish = { sizeof(blowfish_list) / sizeof(*blowfish_list), blowfish_list};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -