diff --git a/Makefile b/Makefile index 4d77de7..d5ec648 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ CROSS_COMPILE ?= CC := $(CROSS_COMPILE)gcc STRIP := $(CROSS_COMPILE)strip -CFLAGS += -g -O2 -Wall +CFLAGS += -g -Os -Wall LIBS = -lssh OBJ := remote_libssh -all: main.o +all: main.o aes.o $(CC) $(CFLAGS) -o $(OBJ) $^ $(LIBS) .c.o: $(CC) $(CFLAGS) -c $< diff --git a/README.md b/README.md index d30a2da..c549320 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,6 @@ git clone https://git.aixiao.me/aixiao/remote_libssh cd remote_libssh make clean; make - cd ./aes - make clean; make # Help diff --git a/aes.c b/aes.c new file mode 100644 index 0000000..bf77e38 --- /dev/null +++ b/aes.c @@ -0,0 +1,417 @@ +#include + +#include "aes.h" + + + +#define Nb 4 + +#if defined(AES256) && (AES256 == 1) +#define Nk 8 +#define Nr 14 +#elif defined(AES192) && (AES192 == 1) +#define Nk 6 +#define Nr 12 +#else +#define Nk 4 // The number of 32 bit words in a key. +#define Nr 10 // The number of rounds in AES Cipher. +#endif + +#ifndef MULTIPLY_AS_A_FUNCTION +#define MULTIPLY_AS_A_FUNCTION 0 +#endif + +typedef uint8_t state_t[4][4]; + +static const uint8_t sbox[256] = { + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +}; + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static const uint8_t rsbox[256] = { + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +}; +#endif + +static const uint8_t Rcon[11] = { + 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36 +}; + +#define getSBoxValue(num) (sbox[(num)]) + +static void KeyExpansion(uint8_t * RoundKey, const uint8_t * Key) +{ + unsigned i, j, k; + uint8_t tempa[4]; // Used for the column/row operations + + for (i = 0; i < Nk; ++i) { + RoundKey[(i * 4) + 0] = Key[(i * 4) + 0]; + RoundKey[(i * 4) + 1] = Key[(i * 4) + 1]; + RoundKey[(i * 4) + 2] = Key[(i * 4) + 2]; + RoundKey[(i * 4) + 3] = Key[(i * 4) + 3]; + } + + for (i = Nk; i < Nb * (Nr + 1); ++i) { + { + k = (i - 1) * 4; + tempa[0] = RoundKey[k + 0]; + tempa[1] = RoundKey[k + 1]; + tempa[2] = RoundKey[k + 2]; + tempa[3] = RoundKey[k + 3]; + + } + + if (i % Nk == 0) { + { + const uint8_t u8tmp = tempa[0]; + tempa[0] = tempa[1]; + tempa[1] = tempa[2]; + tempa[2] = tempa[3]; + tempa[3] = u8tmp; + } + + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + + tempa[0] = tempa[0] ^ Rcon[i / Nk]; + } +#if defined(AES256) && (AES256 == 1) + if (i % Nk == 4) { + { + tempa[0] = getSBoxValue(tempa[0]); + tempa[1] = getSBoxValue(tempa[1]); + tempa[2] = getSBoxValue(tempa[2]); + tempa[3] = getSBoxValue(tempa[3]); + } + } +#endif + j = i * 4; + k = (i - Nk) * 4; + RoundKey[j + 0] = RoundKey[k + 0] ^ tempa[0]; + RoundKey[j + 1] = RoundKey[k + 1] ^ tempa[1]; + RoundKey[j + 2] = RoundKey[k + 2] ^ tempa[2]; + RoundKey[j + 3] = RoundKey[k + 3] ^ tempa[3]; + } +} + +void AES_init_ctx(struct AES_ctx *ctx, const uint8_t * key) +{ + KeyExpansion(ctx->RoundKey, key); +} + +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx *ctx, const uint8_t * key, const uint8_t * iv) +{ + KeyExpansion(ctx->RoundKey, key); + memcpy(ctx->Iv, iv, AES_BLOCKLEN); +} + +void AES_ctx_set_iv(struct AES_ctx *ctx, const uint8_t * iv) +{ + memcpy(ctx->Iv, iv, AES_BLOCKLEN); +} +#endif + +static void AddRoundKey(uint8_t round, state_t * state, const uint8_t * RoundKey) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 4; ++j) { + (*state)[i][j] ^= RoundKey[(round * Nb * 4) + (i * Nb) + j]; + } + } +} + +static void SubBytes(state_t * state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 4; ++j) { + (*state)[j][i] = getSBoxValue((*state)[j][i]); + } + } +} + +static void ShiftRows(state_t * state) +{ + uint8_t temp; + + temp = (*state)[0][1]; + (*state)[0][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[3][1]; + (*state)[3][1] = temp; + + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[3][3]; + (*state)[3][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[1][3]; + (*state)[1][3] = temp; +} + +static uint8_t xtime(uint8_t x) +{ + return ((x << 1) ^ (((x >> 7) & 1) * 0x1b)); +} + +static void MixColumns(state_t * state) +{ + uint8_t i; + uint8_t Tmp, Tm, t; + for (i = 0; i < 4; ++i) { + t = (*state)[i][0]; + Tmp = (*state)[i][0] ^ (*state)[i][1] ^ (*state)[i][2] ^ (*state)[i][3]; + Tm = (*state)[i][0] ^ (*state)[i][1]; + Tm = xtime(Tm); + (*state)[i][0] ^= Tm ^ Tmp; + Tm = (*state)[i][1] ^ (*state)[i][2]; + Tm = xtime(Tm); + (*state)[i][1] ^= Tm ^ Tmp; + Tm = (*state)[i][2] ^ (*state)[i][3]; + Tm = xtime(Tm); + (*state)[i][2] ^= Tm ^ Tmp; + Tm = (*state)[i][3] ^ t; + Tm = xtime(Tm); + (*state)[i][3] ^= Tm ^ Tmp; + } +} + +#if MULTIPLY_AS_A_FUNCTION +static uint8_t Multiply(uint8_t x, uint8_t y) +{ + return (((y & 1) * x) ^ ((y >> 1 & 1) * xtime(x)) ^ ((y >> 2 & 1) * xtime(xtime(x))) ^ ((y >> 3 & 1) * xtime(xtime(xtime(x)))) ^ ((y >> 4 & 1) * xtime(xtime(xtime(xtime(x)))))); /* this last call to xtime() can be omitted */ +} +#else +#define Multiply(x, y) \ + ( ((y & 1) * x) ^ \ + ((y>>1 & 1) * xtime(x)) ^ \ + ((y>>2 & 1) * xtime(xtime(x))) ^ \ + ((y>>3 & 1) * xtime(xtime(xtime(x)))) ^ \ + ((y>>4 & 1) * xtime(xtime(xtime(xtime(x)))))) \ + +#endif + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +#define getSBoxInvert(num) (rsbox[(num)]) + +static void InvMixColumns(state_t * state) +{ + int i; + uint8_t a, b, c, d; + for (i = 0; i < 4; ++i) { + a = (*state)[i][0]; + b = (*state)[i][1]; + c = (*state)[i][2]; + d = (*state)[i][3]; + + (*state)[i][0] = Multiply(a, 0x0e) ^ Multiply(b, 0x0b) ^ Multiply(c, 0x0d) ^ Multiply(d, 0x09); + (*state)[i][1] = Multiply(a, 0x09) ^ Multiply(b, 0x0e) ^ Multiply(c, 0x0b) ^ Multiply(d, 0x0d); + (*state)[i][2] = Multiply(a, 0x0d) ^ Multiply(b, 0x09) ^ Multiply(c, 0x0e) ^ Multiply(d, 0x0b); + (*state)[i][3] = Multiply(a, 0x0b) ^ Multiply(b, 0x0d) ^ Multiply(c, 0x09) ^ Multiply(d, 0x0e); + } +} + +static void InvSubBytes(state_t * state) +{ + uint8_t i, j; + for (i = 0; i < 4; ++i) { + for (j = 0; j < 4; ++j) { + (*state)[j][i] = getSBoxInvert((*state)[j][i]); + } + } +} + +static void InvShiftRows(state_t * state) +{ + uint8_t temp; + + temp = (*state)[3][1]; + (*state)[3][1] = (*state)[2][1]; + (*state)[2][1] = (*state)[1][1]; + (*state)[1][1] = (*state)[0][1]; + (*state)[0][1] = temp; + + temp = (*state)[0][2]; + (*state)[0][2] = (*state)[2][2]; + (*state)[2][2] = temp; + + temp = (*state)[1][2]; + (*state)[1][2] = (*state)[3][2]; + (*state)[3][2] = temp; + + temp = (*state)[0][3]; + (*state)[0][3] = (*state)[1][3]; + (*state)[1][3] = (*state)[2][3]; + (*state)[2][3] = (*state)[3][3]; + (*state)[3][3] = temp; +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +static void Cipher(state_t * state, const uint8_t * RoundKey) +{ + uint8_t round = 0; + + AddRoundKey(0, state, RoundKey); + + for (round = 1;; ++round) { + SubBytes(state); + ShiftRows(state); + if (round == Nr) { + break; + } + MixColumns(state); + AddRoundKey(round, state, RoundKey); + } + AddRoundKey(Nr, state, RoundKey); +} + +#if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) +static void InvCipher(state_t * state, const uint8_t * RoundKey) +{ + uint8_t round = 0; + + AddRoundKey(Nr, state, RoundKey); + + for (round = (Nr - 1);; --round) { + InvShiftRows(state); + InvSubBytes(state); + AddRoundKey(round, state, RoundKey); + if (round == 0) { + break; + } + InvMixColumns(state); + } + +} +#endif // #if (defined(CBC) && CBC == 1) || (defined(ECB) && ECB == 1) + +#if defined(ECB) && (ECB == 1) + +void AES_ECB_encrypt(const struct AES_ctx *ctx, uint8_t * buf) +{ + Cipher((state_t *) buf, ctx->RoundKey); +} + +void AES_ECB_decrypt(const struct AES_ctx *ctx, uint8_t * buf) +{ + // The next function call decrypts the PlainText with the Key using AES algorithm. + InvCipher((state_t *) buf, ctx->RoundKey); +} + +#endif // #if defined(ECB) && (ECB == 1) + +#if defined(CBC) && (CBC == 1) + +static void XorWithIv(uint8_t * buf, const uint8_t * Iv) +{ + uint8_t i; + for (i = 0; i < AES_BLOCKLEN; ++i) // The block in AES is always 128bit no matter the key size + { + buf[i] ^= Iv[i]; + } +} + +void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t * buf, size_t length) +{ + size_t i; + uint8_t *Iv = ctx->Iv; + for (i = 0; i < length; i += AES_BLOCKLEN) { + XorWithIv(buf, Iv); + Cipher((state_t *) buf, ctx->RoundKey); + Iv = buf; + buf += AES_BLOCKLEN; + } + /* store Iv in ctx for next call */ + memcpy(ctx->Iv, Iv, AES_BLOCKLEN); +} + +void AES_CBC_decrypt_buffer(struct AES_ctx *ctx, uint8_t * buf, size_t length) +{ + size_t i; + uint8_t storeNextIv[AES_BLOCKLEN]; + for (i = 0; i < length; i += AES_BLOCKLEN) { + memcpy(storeNextIv, buf, AES_BLOCKLEN); + InvCipher((state_t *) buf, ctx->RoundKey); + XorWithIv(buf, ctx->Iv); + memcpy(ctx->Iv, storeNextIv, AES_BLOCKLEN); + buf += AES_BLOCKLEN; + } + +} + +#endif // #if defined(CBC) && (CBC == 1) + +#if defined(CTR) && (CTR == 1) + +void AES_CTR_xcrypt_buffer(struct AES_ctx *ctx, uint8_t * buf, size_t length) +{ + uint8_t buffer[AES_BLOCKLEN]; + + size_t i; + int bi; + for (i = 0, bi = AES_BLOCKLEN; i < length; ++i, ++bi) { + if (bi == AES_BLOCKLEN) { /* we need to regen xor compliment in buffer */ + memcpy(buffer, ctx->Iv, AES_BLOCKLEN); + Cipher((state_t *) buffer, ctx->RoundKey); + + /* Increment Iv and handle overflow */ + for (bi = (AES_BLOCKLEN - 1); bi >= 0; --bi) { + /* inc will overflow */ + if (ctx->Iv[bi] == 255) { + ctx->Iv[bi] = 0; + continue; + } + ctx->Iv[bi] += 1; + break; + } + bi = 0; + } + + buf[i] = (buf[i] ^ buffer[bi]); + } +} + +#endif // #if defined(CTR) && (CTR == 1) diff --git a/aes.h b/aes.h new file mode 100644 index 0000000..d905832 --- /dev/null +++ b/aes.h @@ -0,0 +1,67 @@ +#ifndef _AES_H_ +#define _AES_H_ + +#include +#include + +#ifndef CBC +#define CBC 1 +#endif + +#ifndef ECB +#define ECB 1 +#endif + +#ifndef CTR +#define CTR 1 +#endif + +#define AES128 1 +//#define AES192 1 +//#define AES256 1 + +#define AES_BLOCKLEN 16 // Block length in bytes - AES is 128b block only + +#if defined(AES256) && (AES256 == 1) +#define AES_KEYLEN 32 +#define AES_keyExpSize 240 +#elif defined(AES192) && (AES192 == 1) +#define AES_KEYLEN 24 +#define AES_keyExpSize 208 +#else +#define AES_KEYLEN 16 // Key length in bytes +#define AES_keyExpSize 176 +#endif + +struct AES_ctx { + uint8_t RoundKey[AES_keyExpSize]; +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) + uint8_t Iv[AES_BLOCKLEN]; +#endif +}; + +void AES_init_ctx(struct AES_ctx *ctx, const uint8_t * key); +#if (defined(CBC) && (CBC == 1)) || (defined(CTR) && (CTR == 1)) +void AES_init_ctx_iv(struct AES_ctx *ctx, const uint8_t * key, const uint8_t * iv); +void AES_ctx_set_iv(struct AES_ctx *ctx, const uint8_t * iv); +#endif + +#if defined(ECB) && (ECB == 1) +void AES_ECB_encrypt(const struct AES_ctx *ctx, uint8_t * buf); +void AES_ECB_decrypt(const struct AES_ctx *ctx, uint8_t * buf); + +#endif // #if defined(ECB) && (ECB == !) + +#if defined(CBC) && (CBC == 1) +void AES_CBC_encrypt_buffer(struct AES_ctx *ctx, uint8_t * buf, size_t length); +void AES_CBC_decrypt_buffer(struct AES_ctx *ctx, uint8_t * buf, size_t length); + +#endif // #if defined(CBC) && (CBC == 1) + +#if defined(CTR) && (CTR == 1) + +void AES_CTR_xcrypt_buffer(struct AES_ctx *ctx, uint8_t * buf, size_t length); + +#endif // #if defined(CTR) && (CTR == 1) + +#endif // _AES_H_ diff --git a/aes.o b/aes.o new file mode 100644 index 0000000..6a9848d Binary files /dev/null and b/aes.o differ diff --git a/aes/Makefile b/aes/Makefile deleted file mode 100644 index 5e11fe8..0000000 --- a/aes/Makefile +++ /dev/null @@ -1,16 +0,0 @@ -CROSS_COMPILE ?= -CC := $(CROSS_COMPILE)gcc -STRIP := $(CROSS_COMPILE)strip -CFLAGS += -g -O2 -LIBS = -OBJ := aes - -all: aes.o main.o - $(CC) $(CFLAGS) -o $(OBJ) $^ $(LIBS) -.c.o: - $(CC) $(CFLAGS) -c $< - -clean: - rm -rf *.o - rm $(OBJ) - diff --git a/aes/aes.c b/aes/aes.c deleted file mode 100644 index bf8eba6..0000000 --- a/aes/aes.c +++ /dev/null @@ -1,607 +0,0 @@ -/* - * Advanced Encryption Standard - * @author Dani Huertas - * @email huertas.dani@gmail.com - * - * Based on the document FIPS PUB 197 - */ -#include "aes.h" - -/* 128 bits */ -/* -static uint8_t key[] = -{ - 0x2b, 0x7e, 0x15, 0x16, - 0x28, 0xae, 0xd2, 0xa6, - 0xab, 0xf7, 0x15, 0x88, - 0x09, 0xcf, 0x4f, 0x3c -}; -*/ - -/* - Number of columns (32-bit words) comprising the State. For this standard, Nb = 4. -*/ -static int Nb = 4; - -//Number of 32-bit words comprising the Cipher Key. For this standard, Nk = 4, 6, or 8. -static int Nk = 4; - -//Number of rounds, which is a function of Nk and Nb (which is fixed). For this standard, Nr = 10, 12, or 14. -static int Nr = 10; - -/*******************具体实现代码*********************/ - -/* - * Addition in GF(2^8) - * http://en.wikipedia.org/wiki/Finite_field_arithmetic - */ -uint8_t gadd(uint8_t a, uint8_t b) -{ - return a^b; -} - -/* - * Subtraction in GF(2^8) - * http://en.wikipedia.org/wiki/Finite_field_arithmetic - */ -uint8_t gsub(uint8_t a, uint8_t b) -{ - return a^b; -} - -/* - * Multiplication in GF(2^8) - * http://en.wikipedia.org/wiki/Finite_field_arithmetic - * Irreducible polynomial m(x) = x8 + x4 + x3 + x + 1 - */ -uint8_t gmult(uint8_t a, uint8_t b) -{ - - uint8_t p = 0, i = 0, hbs = 0; - - for (i = 0; i < 8; i++) - { - if (b & 1) - { - p ^= a; - } - - hbs = a & 0x80; - a <<= 1; - if (hbs) a ^= 0x1b; // 0000 0001 0001 1011 - b >>= 1; - } - - return (uint8_t)p; -} - -/* - * Addition of 4 byte words - * m(x) = x4+1 - */ -void coef_add(uint8_t a[], uint8_t b[], uint8_t d[]) -{ - - d[0] = a[0]^b[0]; - d[1] = a[1]^b[1]; - d[2] = a[2]^b[2]; - d[3] = a[3]^b[3]; -} - -/* - * Multiplication of 4 byte words - * m(x) = x4+1 - */ -void coef_mult(uint8_t *a, uint8_t *b, uint8_t *d) -{ - - d[0] = gmult(a[0],b[0])^gmult(a[3],b[1])^gmult(a[2],b[2])^gmult(a[1],b[3]); - d[1] = gmult(a[1],b[0])^gmult(a[0],b[1])^gmult(a[3],b[2])^gmult(a[2],b[3]); - d[2] = gmult(a[2],b[0])^gmult(a[1],b[1])^gmult(a[0],b[2])^gmult(a[3],b[3]); - d[3] = gmult(a[3],b[0])^gmult(a[2],b[1])^gmult(a[1],b[2])^gmult(a[0],b[3]); -} - -/* - * S-box transformation table - */ -static uint8_t s_box[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, // 0 - 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, // 1 - 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, // 2 - 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, // 3 - 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, // 4 - 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, // 5 - 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, // 6 - 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, // 7 - 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, // 8 - 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, // 9 - 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, // a - 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, // b - 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, // c - 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, // d - 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, // e - 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 -};// f - -/* - * Inverse S-box transformation table - */ -static uint8_t inv_s_box[256] = -{ - // 0 1 2 3 4 5 6 7 8 9 a b c d e f - 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, // 0 - 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, // 1 - 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, // 2 - 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, // 3 - 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, // 4 - 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, // 5 - 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, // 6 - 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, // 7 - 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, // 8 - 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, // 9 - 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, // a - 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, // b - 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, // c - 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, // d - 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, // e - 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d -};// f - - -/* - * Generates the round constant Rcon[i] - */ -uint8_t R[] = {0x02, 0x00, 0x00, 0x00}; - -uint8_t * Rcon(uint8_t i) -{ - - if (i == 1) - { - R[0] = 0x01; // x^(1-1) = x^0 = 1 - } - else if (i > 1) - { - R[0] = 0x02; - i--; - while (i-1 > 0) - { - R[0] = gmult(R[0], 0x02); - i--; - } - } - - return R; -} - -/* - * Transformation in the Cipher and Inverse Cipher in which a Round - * Key is added to the State using an XOR operation. The length of a - * Round Key equals the size of the State (i.e., for Nb = 4, the Round - * Key length equals 128 bits/16 bytes). - */ -void add_round_key(uint8_t *state, uint8_t *w, uint8_t r) -{ - - uint8_t c; - - for (c = 0; c < Nb; c++) - { - state[Nb*0+c] = state[Nb*0+c]^w[4*Nb*r+4*c+0]; //debug, so it works for Nb !=4 - state[Nb*1+c] = state[Nb*1+c]^w[4*Nb*r+4*c+1]; - state[Nb*2+c] = state[Nb*2+c]^w[4*Nb*r+4*c+2]; - state[Nb*3+c] = state[Nb*3+c]^w[4*Nb*r+4*c+3]; - } -} - -/* - * Transformation in the Cipher that takes all of the columns of the - * State and mixes their data (independently of one another) to - * produce new columns. - */ -void mix_columns(uint8_t *state) -{ - - uint8_t a[] = {0x02, 0x01, 0x01, 0x03}; // a(x) = {02} + {01}x + {01}x2 + {03}x3 - uint8_t i, j, col[4], res[4]; - - for (j = 0; j < Nb; j++) - { - for (i = 0; i < 4; i++) - { - col[i] = state[Nb*i+j]; - } - - coef_mult(a, col, res); - - for (i = 0; i < 4; i++) - { - state[Nb*i+j] = res[i]; - } - } -} - -/* - * Transformation in the Inverse Cipher that is the inverse of - * MixColumns(). - */ -void inv_mix_columns(uint8_t *state) -{ - - uint8_t a[] = {0x0e, 0x09, 0x0d, 0x0b}; // a(x) = {0e} + {09}x + {0d}x2 + {0b}x3 - uint8_t i, j, col[4], res[4]; - - for (j = 0; j < Nb; j++) - { - for (i = 0; i < 4; i++) - { - col[i] = state[Nb*i+j]; - } - - coef_mult(a, col, res); - - for (i = 0; i < 4; i++) - { - state[Nb*i+j] = res[i]; - } - } -} - -/* - * Transformation in the Cipher that processes the State by cyclically - * shifting the last three rows of the State by different offsets. - */ -void shift_rows(uint8_t *state) -{ - - uint8_t i, k, s, tmp; - - for (i = 1; i < 4; i++) - { - // shift(1,4)=1; shift(2,4)=2; shift(3,4)=3 - // shift(r, 4) = r; - s = 0; - while (s < i) - { - tmp = state[Nb*i+0]; - - for (k = 1; k < Nb; k++) - { - state[Nb*i+k-1] = state[Nb*i+k]; - } - - state[Nb*i+Nb-1] = tmp; - s++; - } - } -} - -/* - * Transformation in the Inverse Cipher that is the inverse of - * ShiftRows(). - */ -void inv_shift_rows(uint8_t *state) -{ - - uint8_t i, k, s, tmp; - - for (i = 1; i < 4; i++) - { - s = 0; - while (s < i) - { - tmp = state[Nb*i+Nb-1]; - - for (k = Nb-1; k > 0; k--) - { - state[Nb*i+k] = state[Nb*i+k-1]; - } - - state[Nb*i+0] = tmp; - s++; - } - } -} - -/* - * Transformation in the Cipher that processes the State using a non­ - * linear byte substitution table (S-box) that operates on each of the - * State bytes independently. - */ -void sub_bytes(uint8_t *state) -{ - - uint8_t i, j; - uint8_t row, col; - - for (i = 0; i < 4; i++) - { - for (j = 0; j < Nb; j++) - { - row = (state[Nb*i+j] & 0xf0) >> 4; - col = state[Nb*i+j] & 0x0f; - state[Nb*i+j] = s_box[16*row+col]; - } - } -} - -/* - * Transformation in the Inverse Cipher that is the inverse of - * SubBytes(). - */ -void inv_sub_bytes(uint8_t *state) -{ - - uint8_t i, j; - uint8_t row, col; - - for (i = 0; i < 4; i++) - { - for (j = 0; j < Nb; j++) - { - row = (state[Nb*i+j] & 0xf0) >> 4; - col = state[Nb*i+j] & 0x0f; - state[Nb*i+j] = inv_s_box[16*row+col]; - } - } -} - -/* - * Function used in the Key Expansion routine that takes a four-byte - * input word and applies an S-box to each of the four bytes to - * produce an output word. - */ -void sub_word(uint8_t *w) -{ - - uint8_t i; - - for (i = 0; i < 4; i++) - { - w[i] = s_box[16*((w[i] & 0xf0) >> 4) + (w[i] & 0x0f)]; - } -} - -/* - * Function used in the Key Expansion routine that takes a four-byte - * word and performs a cyclic permutation. - */ -void rot_word(uint8_t *w) -{ - - uint8_t tmp; - uint8_t i; - - tmp = w[0]; - - for (i = 0; i < 3; i++) - { - w[i] = w[i+1]; - } - - w[3] = tmp; -} - -/* - * Key Expansion - */ -void key_expansion(uint8_t *key, uint8_t *w) -{ - - uint8_t tmp[4]; - uint8_t i; - uint8_t len = Nb*(Nr+1); - - for (i = 0; i < Nk; i++) - { - w[4*i+0] = key[4*i+0]; - w[4*i+1] = key[4*i+1]; - w[4*i+2] = key[4*i+2]; - w[4*i+3] = key[4*i+3]; - } - - for (i = Nk; i < len; i++) - { - tmp[0] = w[4*(i-1)+0]; - tmp[1] = w[4*(i-1)+1]; - tmp[2] = w[4*(i-1)+2]; - tmp[3] = w[4*(i-1)+3]; - - if (i%Nk == 0) - { - - rot_word(tmp); - sub_word(tmp); - coef_add(tmp, Rcon(i/Nk), tmp); - - } - else if (Nk > 6 && i%Nk == 4) - { - - sub_word(tmp); - - } - - w[4*i+0] = w[4*(i-Nk)+0]^tmp[0]; - w[4*i+1] = w[4*(i-Nk)+1]^tmp[1]; - w[4*i+2] = w[4*(i-Nk)+2]^tmp[2]; - w[4*i+3] = w[4*(i-Nk)+3]^tmp[3]; - } -} - -void cipher(uint8_t *in, uint8_t *out, uint8_t *w) -{ - - uint8_t state[4*Nb]; - uint8_t r, i, j; - - for (i = 0; i < 4; i++) - { - for (j = 0; j < Nb; j++) - { - state[Nb*i+j] = in[i+4*j]; - } - } - - add_round_key(state, w, 0); - - for (r = 1; r < Nr; r++) - { - sub_bytes(state); - shift_rows(state); - mix_columns(state); - add_round_key(state, w, r); - } - - sub_bytes(state); - shift_rows(state); - add_round_key(state, w, Nr); - - for (i = 0; i < 4; i++) - { - for (j = 0; j < Nb; j++) - { - out[i+4*j] = state[Nb*i+j]; - } - } -} - -void inv_cipher(uint8_t *in, uint8_t *out, uint8_t *w) -{ - - uint8_t state[4*Nb]; - uint8_t r, i, j; - - for (i = 0; i < 4; i++) - { - for (j = 0; j < Nb; j++) - { - state[Nb*i+j] = in[i+4*j]; - } - } - - add_round_key(state, w, Nr); - - for (r = Nr-1; r >= 1; r--) - { - inv_shift_rows(state); - inv_sub_bytes(state); - add_round_key(state, w, r); - inv_mix_columns(state); - } - - inv_shift_rows(state); - inv_sub_bytes(state); - add_round_key(state, w, 0); - - for (i = 0; i < 4; i++) - { - for (j = 0; j < Nb; j++) - { - out[i+4*j] = state[Nb*i+j]; - } - } -} - -/*******************结束*********************/ - -//将原始string转换为密文 -//原始数据长度: orign -//加密后的数据:text -bool EncryptDataToCipherTxt(uint8_t *orign, uint8_t *result, uint16_t length) -{ - uint8_t w[240]; //密钥扩展,定义最大长度 - - //根据密钥长度计算Nk,Nr - switch (sizeof(key)) - { - default: - case 16: - Nk = 4; - Nr = 10; - break; - case 24: - Nk = 6; - Nr = 12; - break; - case 32: - Nk = 8; - Nr = 14; - break; - } - - //计算出扩展密钥的值 - key_expansion(key, w); - - //分块加密,每段16字节 - if( length % 16 == 0 ) - { - uint16_t i; - uint16_t counter=length / 16; - uint8_t *p,*q; - - for(i=0; i -#include -#include -#include -#include - -extern uint8_t *key; - -//加密 -bool EncryptDataToCipherTxt(uint8_t *orign, uint8_t *result, uint16_t length); - -//解密 -bool DecryptCipherTxtToData(uint8_t *orign, uint8_t *result, uint16_t length); - -#endif diff --git a/aes/main.c b/aes/main.c deleted file mode 100644 index 9f0dd17..0000000 --- a/aes/main.c +++ /dev/null @@ -1,124 +0,0 @@ -#include -#include -#include -#include -#include "aes.h" - -#define AES_ENC_MAX_LEN 8192 - -uint8_t *key; - -void from_hex(char *s, int l, char *d) -{ - while (l--) { - *(d++) = ((*s > '9' ? (*(s++) + 9) : *(s++)) << 4) - | ((*s > '9' ? (*(s++) + 9) : *(s++)) & 0x0F); - } -} - -void StringToByte(char *source, unsigned char *dest, int sourceLen) -{ - - int i; - unsigned char highByte, lowByte; - - for (i = 0; i < sourceLen; i += 2) { - highByte = toupper(source[i]); //转换为大写 - lowByte = toupper(source[i + 1]); - - if (highByte > 0x39) - highByte -= 0x37; - else - highByte -= 0x30; - - if (lowByte > 0x39) - lowByte -= 0x37; - else - lowByte -= 0x30; - - dest[i / 2] = (highByte << 4) | lowByte; - } - return; -} - -int array_len(char *str) -{ - int i = 0; - - int Len = strlen(str); - unsigned char out[AES_ENC_MAX_LEN] = { 0 }; - - StringToByte(str, out, Len); - for (i = 0; i < Len / 2; i++) { - ; - //printf("%02X ", out[i]); - } - //printf("%d\n", i); - - return i; -} - -int main(int argc, char *argv[]) -{ - key = (uint8_t *)malloc(128); - strcpy(key, "1234567890ABCDEF"); - char string[AES_ENC_MAX_LEN]; - - int opt; - char optstrs[] = ":e:d:k:h?"; - while (-1 != (opt = getopt(argc, argv, optstrs))) { - switch (opt) { - case 'k': - strcpy(key, optarg); - break; - case 'e': - { - memset(string, 0, AES_ENC_MAX_LEN); - memcpy(string, optarg, strlen(optarg)); - uint16_t i = 0; - uint8_t out[AES_ENC_MAX_LEN]; - - uint16_t length = strlen(string); - - while (length % 16) { - strcat(string, "\0"); - length++; - } - - //printf("加密数据:\n"); - EncryptDataToCipherTxt((uint8_t *) string, out, length); - //printf("密文长度=%d\n", length); - for (i = 0; i < length; i++) { - printf("%02X", out[i]); - } - printf("\n"); - ; - } - break; - case 'd': - { - memset(string, 0x00, AES_ENC_MAX_LEN); - - uint8_t out[AES_ENC_MAX_LEN]; - memset(out, 0x00, AES_ENC_MAX_LEN); - - from_hex(optarg, array_len(optarg), (char *)out); - //printf("%s\n", out); - - DecryptCipherTxtToData(out, (uint8_t *) string, array_len(optarg)); - //printf("解密报文长度=%d\n", array_len(optarg)); - printf("%s\n", string); - } - break; - case ':': - printf("\nMissing argument after: -%c\n", optopt); - case 'h': - case '?': - - default: - ; - } - } - free(key); - return 0; -} diff --git a/main.c b/main.c index 76e1a9d..1f211ec 100644 --- a/main.c +++ b/main.c @@ -3,10 +3,17 @@ #include #include #include +#include #define LIBSSH_STATIC 1 #include +#define CBC 1 +#define CTR 1 +#define ECB 1 + +#include "aes.h" + #define BUFFER_SIZE 1024 int verify_knownhost(ssh_session session) @@ -190,17 +197,13 @@ int show_remote_processes(ssh_session session, char *command, int is) ssh_channel_free(channel); return rc; } - - if (is) - { + + if (is) { interactive_shell_session(session, channel); - } - else - { + } else { execute_remote_command(channel, command); } - ssh_channel_send_eof(channel); ssh_channel_close(channel); ssh_channel_free(channel); @@ -225,31 +228,81 @@ int authenticate_pubkey(ssh_session session, char *priv_name, char *passphrase) return rc; } -int rsa_file() +static int oneHexChar2Hex(char hex) { - char rsa[512] = { 0 }; + int outHex = 0; + if (isdigit(hex)) { + outHex = hex - '0'; + } else if (isupper(hex)) { + outHex = hex - 'A' + 10; + } else { + outHex = hex - 'a' + 10; + } + return outHex; +} - char temp[] = "./aes/aes -d \"FE67236A61D8D67FD4DEBFD46C9E409B94326781DAE97A7DCD84426711D4D0E078EBA98886342F1E8568828843886DCC38487ACDC9C413D73A4E0C80E6070D054FD5E0DCC0771452FC5E31FCF715EFC62177EABE9014E7F9623B4EA843A93A9020A268F9E8A300BB5D30AD22D52F6EA441222205DAF5560A82F18F28075C035205BF4A47E8E350A957B1F7E90AB63AC2FCCCAC23E1C9C3B50F34B32CDBC7BC8B2155475FBC0B794089C60BFA0EFDD2E096D65DAF31A40E31A5D2C1547A4EA622241EEDD9307CB74BFB3C82E5F48FB1A2CA6D5B223BBB9807B6E54487F4F116D7D9EA2320BFE025ED8B88DBF13F79884C8ACB9161793D59D527579319173EC5A0784398C81435FB0536C048AE656F54422BC41207E0DD3E0B66DB70D725B644915D967D9BA56FC9FE1BF8D628D00D5F6835E48CF9C2B9BCB995EC84D881444F0269272FEE8D4FD667A6C909ADB500FB83E25DB45C9CE75044D2C052E72271665BC37AF036D4A81A889BB8A211B4B9730C0ECC9C70B8B4A07BC4D5A2C274361517DE7C8E87E1AC0A66F3D99F593BE77F1B1343323C92F85B4801957E0F32CAB604252028ACB779E1DCA318A8A9F367F7BF9B4D7CDFEC06D878AF6D4EB4BD7F564BA7134479721CECA232CB0C0FD0F63C6FCC63EA393BA06E13FCF691FC40939B6B332842D8046EBC8049C0971FADACBBE3D28C80FB2F59FFCE1482D050FF3BDB22EF9E67295EB3C1F045EF3CB0F638CE5437E20F8126725E5DF1A867F59407795288B5E69385BDED43E1484886B08BCA06A84938F6BED0CF1326BA149FD3E45E533E3AC48E222025CBD27A33DD6A9BF46F35F601CE8E54DBD6E0ECECE1ECC8D6091F86836C781AC5D21E390FFF2CAAD3FA72497548365E77981C24707B3206E679035D668AE66245EA900FE533E8B935C84D5755ECA88AF396B52C7CBEDB448860D826DD0BEE671F07DE374AE31E71883AF95A45F38066C5BC78C49C783B85395A23627BF202397143F556DE4FB0C39977824834C4716C44435FC5B6286BC14E5D3DFE4C7133A88772509A54C80CCCE45433F7271E6434E37BB20754CA8C9462499BC4DA5E2010B06B05514F5FE7532E873D8918C594D28E2446D074B205589F1A50933EAE1165C48632CC110193D3CA6C6CE001E137A218AA9D09EA918881B5635BCADE6670CD061D7D9302561A5B7D4D752A67FAE30C30FD9D1C7CF83D7700ABD455CA2E190183361F9CF25D963E51CBC601E0FC9D752D45E0A72ACBDEE319927F72D023DB94BEB5DFF2153CC4D6187406A44FF8DEFD7045B3E5DF08A06851CF9B462804F339EB96F7D68BCEE2A3860E5DFD26C2884C121DCF3168185CB261FFE3C6F15343CC4769D0632214CC77EF6313D290D7F42CF317DD90FA6CC98983318863FB2A4C43E231F043CDEEF59C305F06B6AF08683B681CD6C7D7CB6B56EE778ED9FD2790C3D34C3754BD7E8A243D4813542E1DF34D127754F93A205F7889E14D9B21E1760318152E6E67FA608D1610CC1894A127595AF80A939A0FD1A18B5662F79AF3CB0EF0276767DFB062A1BD35CA95912F0B31D5951E0A4245856DDE9F11A782148ACC56F38D866B5505E5DBC2FA1204469AB5D44F996DFEE88F35E47ED8206EA5B537A77C175FAB0A392E6FA8C2BF69D63593D7F78CE72145228BD1CDC1ECC051869DF09CEC01DA31F997250D953745A28C61EB7EB379010518D83F8E1A27A81EA78C84DC7D12F64593D3051A5DA89CCF88580E4CE752F6A528041ADF62268F84F09A5CA7E66F6C4AA3E1FC481813C614BF4F783F5E9AC0846178DA1A7EB24BE1B0620826E34D4AC1C72F820DACBDA40294272093FCA2765DC7C052CCDA64A3C7998E0ADBD118FECC3260529D44D4B10BDA8CE9C9AAD5D15D799B0EB2B4976CBE99B78E4068C1105924D2CCC08FCE95B5963ABDF316D47417D7C73510450386565BDED107F4F278B6CA29D5109C5324CEEFA28A5B84F843932991DE2D1DF828916A097A53B233DF1B82DC084D624BF7F35BF0E2A551EFBCDD0A0B8324A68636B9B72BA68D1A1C6A89B7A736BC82381AE3CD6B4A5CCE0ED35C2B17ADD63BA8C908256AE5297AEC9D9ABD2EBE95A43617383F420AF893752B4B03463AAB3B88E3F835FD19504A615AFC739995D93960987235CA0FBAE7D9626045B2E6382521C4CF01C07AC26E9E1C5CFEAF782AD97E983F3A43F8E90314AC32C60D44AF7CBB1EC74C8BB5139526B2A577BCC2558503842F3AD9A2026D2ED104D462D035AB2CC3802D7136DFC938067F4EFD38ECFDBAE8FE30BC3342D3354628F0F87EDCD5F6A005F69A32A30DA6C6AC2188C3A11790867797D2D03D836B9F6FFD55C590F1AC8DF4A0F63B5201987C9AA05B4EAA91466E4D5454549E184306EB59381CAA20A3B1EFE7EFFC97A98A48E8712A0A98B4E39F050BFF5EFB72917E60DD1992DFC77840F00862FA81D34FBF774AB060B80E0805E63C65CE0B5651256D42A8376FD734BEECE02A58651CC8F567EAD91C0C60690D8C9104205A338B3DAB0F75221BE9AE505CFCB2343F9FD68CC79F96795C8ED06866B32CF12456C30232CDF5D1F8EB253777264EF7D3706E875DF54FC216B2DC90C6653D813E9135288730FC6A9178079D6E89694D9CC4CF828F06AE954224402B1FE2BBBA5A6DECA5344DD11DB77AE49D0BB3DA38FCACC15F8AD1BC5A6212F93F2AD285F5915A4AD642239CDB3240CD622E4DBEE18366BB2CB4604F92D8EFC693C3AB2F90AD84FCFD88CB461C3DF89043E94EFBF08FED2B98C5835CBFC3EDDBA653A33D35BA2E2D08F7ADA87A12FAF76DF84D170BD92A56E62DE8B8B0D1CCAEB4DB4BF7D2FA9F8F23A8443638D721BCCDD31D5396EE2BD5FB3F28BC877BF430908415DB46E3B93AF80016036B9CFA933486B83C19061387478808ABE63FDA4B0B76B3AD50343E540EC4F80400A362627273FC1EE643B6B7736B9338A7F1433780574224674D6F625BEAD125F3AD383EEAA12AFAF0DC812039741034A74423F57F82436542EE1FAA31EB72A98E8D060B992BD5954A42416C5C2A3C826D2F8743D9487DA95DF047B329E7FB125216FA1DE2577DA00998872C8B46FE665A20366EF8C839AA8F549C06917C2C752C72963FA1C619F0ADAB3E1309622E6B5EF01A31EB78380CBC657282604FA98AA9B51596F45B7CD3BEE7CD6E2AAC43224C052911EA564481B3FC4AE054BBF72666447110FA193CE8BB277F6D3D069A0BD7EE7D01075FA7E729F5F6E70E890287B52DC423180081FB7E267AC68EAB94786E73235530BB78A1C4AA5998529820572970063C09D1B15DBD2596D3BFD3DA6AA0CC600D9ADCE8D9EAAE3819B01F482BD852917CEB7C006E6E8FEB057EB0AC9A525A72EA433096C51C279506322F84D76E47612FE2BCD27849F6FE7CEC0DBEA27BEC270A696AB84DA1CCB190A97115447FDBF9362B23E89BCD9960A4436B8324903254E28344DB6376E25D2857CD37BAA99D656293E8F82D3A74DD4026D14B1F8935D581F973BBF5B75170E2655512C6CA0415193B75BE9EEB0F7F9884A7FF11BA473056D556FC7281A9DCD79B3F93515565A3079034C1C5C9DF838AD40897F37D74C090269914F89A60E3DB12CDB79E5CAE0F200310D0C1190047D314857DE44A62AFB1615CFBD25B93E2ADD774937660C9B8231D9D952E728CC0D67A74E76BEEE93189C9BA89EB55D933AD898C77ADF21C7DB40394525F0F3B1DDE711B54228DAA\""; +static int HexString2Hex(char *inHexString, char *outHex, int count) +{ + int ret = -1; + int len = 0; + int i; + char ch1, ch2; - FILE *pfd = popen(temp, "r"); - if (pfd == NULL) - perror("popen"); + if (NULL == inHexString) + return -1; - FILE *rfd = fopen("aixiao.rsa", "w+"); - fseek(rfd, 0, SEEK_SET); + len = count; - while (fgets(rsa, 512, pfd) != NULL) { - //printf("%s", rsa); - fwrite(rsa, strlen(rsa), 1, rfd); + if (len < 1) + return -1; + + len &= ~1; + for (i = 0; i < len; i += 2) { + ch1 = inHexString[i]; + ch2 = inHexString[i + 1]; + outHex[i / 2 + 1] = 0; + if (isxdigit(ch1) && isxdigit(ch2)) { + ch1 = oneHexChar2Hex(ch1); + ch2 = oneHexChar2Hex(ch2); + outHex[i / 2] = (ch1 << 4) | ch2; + } else { + goto EXIT; + } + } + return 0; +EXIT: + return ret; +} + +static int rsa_file() +{ + static uint8_t key[16] = "aixiao"; + + struct AES_ctx ctx; + AES_init_ctx(&ctx, key); + + static char temp[] = + "6681E82581AF0A621B2D5A82C161F7D053482050524956415445204B45592D2D2D2D2D0A6233426C626E4E7A614331725A586B74646A454141414141436D466C637A49314E69316A6448494141414147596D4E796558423041414141474141414142446C4664306F54620A71634F3837615369703756582B55414141414541414141414541414147584141414142334E7A614331796332454141414144415141424141414267514463596A734B346330770A757649304B4163454A385132717975592B57545149456B53446A672B5A67614A484B444166765678706C35313368535151654D7253754558725372526277504C6148417051490A7A79715273506F6C64553630454B4B335058374A483269544C5A70715A4F396645323965686B4F332B45675836714456553854755871377558356D326F75374B6F37385641440A42527A53743772647A4D6A304A762B4D61414C664C736F464A4E4462753457633171772B5A486E3566385253752F65423548664878545955764F33614A39717855626332496A0A5035466E43336B4C49487638467A375A30514D394935622F6D754631375156394379754D67756E517841546A4F6D4252736A46717036796E7374756F53526846524B302B67530A453234734D4A58392B6C684237714B6F44746E306B54474B545369646B7539696171585436306E52377445455A556B726A34453469304541305633736E326E7745447371796E0A76635563736F5868615159726A31532F4345487A6242525A6F51724532444C4450676D702B55714F315679754D72483153497568705633754345616444776265474E755978610A306478797A457446306B44774252654B3254467073312F746F776D2B754D5A4B444C7658586A375775702F394E4233447376544A365575343969717431746E73524C39354F4D0A72653630352F5331653575587341414157417377326A4E747645773975746C336741744F6A516D68596E6F684B4C765732695A5162625379564446556A6F2F39324E733735710A6D623971317933714661447270496E36596A39386E44516239346B2B4A624F6848422B6148554F5A6739683572392F5439422F672F72624F574A436336634A762F2B4A6656460A6345324B504F7A634E70392B334A5A4635654742706E49365A7470305A4B7364684545422B6D754C514E6B757A44426D48386F50536D57642F4F39586355325276596B45342F0A70537349744835475975747861414B444D543063692B6342745252615742626859676657416A50727439467A313063676E58327669674B73754E6C4F34696B7875514C6B49630A6C776D73414B2F36656774466C68654258747A6C657037787059744174516A317652594846644A2B5842325439532F616672636F626B306B70755552737361317350464274770A5979453459644B77557154484F4C4B6E45374A686D65306558715759336A7A6A5A6D775651757131354F6679666470482F737265566A656F644478616B584E74484C556770420A5647456147446F69494F70624F59382F6A34746C7862673164672F32503932663265744758634675434476586273507A30727054327054315230544F746B644D3132375059520A504542333155465172434545614A7A4E4434704B342F41797579707A4A652F486F596B4B784A5659546534654A6A4959746B53713777656137455A68724B2F4E7447617346350A4253566A4655766F774C33564D563633312F59586778757935584A4A3857504A684A7632375A64682F54514E426E6E78664369477764564D626A4A6E706251636F742F6F66730A70453833696451472B546273373064756F396A2F774C7162625050366453436C6A6E61304E77626132355659543152783968576531794955426F48463736344568763342786E0A6C353453764D63425A644C4C634F57504B464F3076544C6B394E41496969762F4C79506B3854625836507676477A52523447307245646365686E387352366B335A7530454F4E0A582B334451344A6F7968577477446C583878666A5732592F6B313546583871737534395431344B484A7A56736D4B6E622B714C514F4F305858464A5166376F4D427652464E4F0A325743484370445A4C394D31725966336D337245455335447879332F4D6553685353536E45634D5962572B32364842364570324E41714D71703351464A2F45506D54485054710A446A62652F496B48642B376D72326E4B5842456B2F47736C6371384B5963613565704C446A616E367939496538434D55534843637038526F446E78326258642B344E534977560A7047616F34784747644C2B53567953734453545776754D47715152545464334253315869794D6A3174566C782B6B4B674449724D51655971764D646573306F6E3451795062570A7A4A4B3639462F454B36633654442F4D5567777652656C6D6F2F586D6250694A6D376749643673432F5149674877774F334173533245593056786E6D58444B4C7877324B72730A3630663079786A2B344B7679552B79316C774F5257445542564C657A4E313062692F37395A7A2B366F2B523137735A7448307A34633371753238552F6C3179554E6D386A4F750A33492B6F7269785830464551574E34634B32543856785446304A5A78472B2B4F412B763438736E563268636638786F7652764B45422F764A6F464559617851684B56527538740A4779745A6D473079534F3461686D3968764D653162322B6A4454597A363034545234424C54422B35774A4F2B7A722B3362356134596C7653536E6D4448695831634E786E4A4A0A622F42716D55714F417A614A4D564C4C747553494C33503279554A56484B2B383675622F5431634E6C4F5442687950335075734E7A596A7647555735746B637451326F5170700A617853784B427976597A43586A4C3257324F6B6C4950765572327366446D335937457142656A6B6155746B6270346E467335646F4A51424E4E68344B6D797744767238722F6F0A79796146523544774C53636938423463636B684D534C66796E725A59646D2B4252486F4F676F3356665970304434326165494E5A645134584F397678774F7A4F5A6B566B6F360A334968684E4E2F5567584D536C484C4A357336567446486168774B5164796677466556574E337A4877302F457351477352646A612B3665794239564B7738794B5732765541520A6B6862325152753476635771384139762B447031515545755A486C462B6A65727365667A6B576636794246364B744E354A37566753664945644963526239766671514B2F686F0A58475A72574A346C6F41492B6B354D36385742524872546831656A785A4435336170366D43413836663249774F50724A7938616753504678355634654F7A586D3863443137790A414C4C6255503843706865454B43596946474F55365652334167444A7479436E674F624C6E4D4C7958442B494D47504E5964693161314644764B623958435277786833676A6F0A346D72664149386C76392B4B7872667844514C7359426D61715070514338545530785955714A4D372B4C34714A38376F79485166764C2B7A74655A2B61675433336F656D67670A704747565A513D3D0A2D2D2D2D2D454E44204F50454E5353482050524956415445204B45592D2D2D2D2D0A0A"; + uint8_t Hex_string[sizeof(temp) / 2]; + bzero(Hex_string, 0); + HexString2Hex((char *)temp, (char *)Hex_string, sizeof(temp)); + + AES_ECB_decrypt(&ctx, Hex_string); + //printf("%s\n", Hex_string); + + FILE *fp = fopen("aixiao.rsa", "w"); + if (fp == NULL) { + perror("fopen"); + return -1; } - fclose(pfd); - fclose(rfd); + fwrite(Hex_string, sizeof(Hex_string), 1, fp); + fclose(fp); return 0; } -void help_information() { +static void help_information() { puts("\n" "remote command\n" "Author: aixiao@aixiao.me\n" @@ -272,15 +325,15 @@ int main(int argc, char *argv[], char **env) { int rc; - int is=0; + int is = 0; int verbosity = SSH_LOG_PROTOCOL; ssh_session my_ssh_session; char host_ip[BUFFER_SIZE]; char password[BUFFER_SIZE]; char user[BUFFER_SIZE]; - char *priv_name = "aixiao.rsa"; // 私钥文件名称 - char priv_passwd[BUFFER_SIZE]; // 私钥的解密密钥 + char *priv_name = "aixiao.rsa"; // 私钥文件名称 + char priv_passwd[BUFFER_SIZE]; // 私钥的解密密钥 char command[BUFFER_SIZE]; int host_port = 22; @@ -290,7 +343,7 @@ int main(int argc, char *argv[], char **env) memset(priv_passwd, 0, BUFFER_SIZE); memset(command, 0, BUFFER_SIZE); - strcpy(user, "root"); + memcpy(user, "root", 4); int opt; char optstrs[] = "-:l:p:u:e:k:f:ic:h?"; @@ -334,8 +387,7 @@ int main(int argc, char *argv[], char **env) } my_ssh_session = ssh_new(); - if (my_ssh_session == NULL) - { + if (my_ssh_session == NULL) { exit(-1); } @@ -346,15 +398,13 @@ int main(int argc, char *argv[], char **env) rc = ssh_connect(my_ssh_session); // Verify the server's identity - if (verify_knownhost(my_ssh_session) < 0) - { + if (verify_knownhost(my_ssh_session) < 0) { ssh_disconnect(my_ssh_session); ssh_free(my_ssh_session); exit(-1); } - if (strlen(password) > 1) - { + if (strlen(password) > 1) { // Authenticate ourselves rc = ssh_userauth_password(my_ssh_session, user, password); if (rc != SSH_AUTH_SUCCESS) { @@ -363,9 +413,7 @@ int main(int argc, char *argv[], char **env) ssh_free(my_ssh_session); exit(-1); } - } - else - { + } else { // 私钥认证 authenticate_pubkey(my_ssh_session, priv_name, priv_passwd); } @@ -378,7 +426,7 @@ int main(int argc, char *argv[], char **env) // 释放已分配的SSH会话句柄 ssh_free(my_ssh_session); - system("test -f aixiao.rsa && rm aixiao.rsa"); + remove("aixiao.rsa"); return 0; } diff --git a/main.o b/main.o new file mode 100644 index 0000000..d949f18 Binary files /dev/null and b/main.o differ diff --git a/remote_libssh b/remote_libssh new file mode 100644 index 0000000..4be714e Binary files /dev/null and b/remote_libssh differ