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

📄 sshblowf.c

📁 一个FTP下载的源代码。代码质量非常高
💻 C
📖 第 1 页 / 共 2 页
字号:
    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	32

static 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 + -