В программе "C", как я могу хранить шестнадцатеричное значение в строковой переменной?
У меня есть программа, которая принимает входные данные в виде открытого текста, а затем расшифровывает сообщение, используя метод 3DES в режиме CBC. Но значения жестко запрограммированы в программе, которую я хочу предоставить в зашифрованном виде, которую следует расшифровать. Как я могу сделать это в следующей программе?
int main(void)
{
unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE];
unsigned char *e = out;
int len;
DES_cblock key;
DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10};
DES_cblock ivsetup = {0xE1, 0xE2, 0xE3, 0xD4, 0xD5, 0xC6, 0xC7, 0xA8};
DES_key_schedule keysched;
DES_cblock ivec;
memset(in, 0, sizeof(in));
memset(out, 0, sizeof(out));
memset(back, 0, sizeof(back));
RAND_seed(seed, sizeof(DES_cblock));
DES_random_key(&key);
DES_set_odd_parity(&key);
if (DES_set_key_checked((C_Block *)key, &keysched))
{
fprintf(stderr, "ERROR: Unable to set key schedule\n");
exit(1);
}
/* 64 bytes of plaintext */
/* From here, encryption starts for the plaintext below. */
strcpy(in, "Now is the time for all men to stand up and be counted");
printf("Plaintext: [%s]\n", in);
len = strlen(in);
memcpy(ivec, ivsetup, sizeof(ivsetup));
DES_ncbc_encrypt(in, out, len, &keysched, &ivec, DES_ENCRYPT);
printf("Ciphertext:");
while (*e) printf(" [%02x]", *e++);
printf("\n");
/* Till here, encryption is over. After this we have to decrypt
* the value which has been encoded, but I want to remove all this
* part and to provide my own encrypted message, and get the
* proper output.
*/
memcpy(ivec, ivsetup, sizeof(ivsetup));
/* The problem I am facing is how to provide the value properly
* to the parameter "out" and "keysched", which should be of my
* choice. For "out" I want to provide THIS value:
* "2DC39619B4450A8C27A3976C50DE5799".
*/
DES_ncbc_encrypt(out, back, len, &keysched, &ivec, DES_DECRYPT);
printf("Decrypted Text: [%s]\n", back);
exit(0);
}
Узнайте больше: http://blog.fpmurphy.com/2010/04/openssl-des-api.html
4 ответа
Я сделал это Пока я делал это по-детски, но сейчас это работает. Я сделал это так
out[0]=0xA0; out[1]=0x69; out[2]=0x57; out[3]=0x3B;
out[4]=0x70; out[5]=0x26; out[6]=0x1C; out[7]=0xE8;
out[8]=0xEF; out[9]=0xF2; out[10]=0x9F;out[11]=0x60;
out[12]=0x80;out[13]=0x60;out[14]=0xB2;out[15]=0xE5;
Позже я сделаю это в цикле.
Прочтите C FAQ 20.10. Шестнадцатеричное представление. Все числа хранятся в двоичном виде внутри. Ваш DES_cblock
вероятно typedef
для (без знака, возможно!) целочисленного типа. Итак, что вы имеете в виду, это массив целых чисел. Вы можете поместить числа в десятичное, шестнадцатеричное или двоичное - но все они будут работать. Шестнадцатеричный обычно используется в криптографии, потому что он имеет некоторые нотационные преимущества.
Создайте функцию дампа следующим образом:
hexdump(char *buff, int len) {
int i,tmp;
for(i=0; i < len; i++) {
tmp = buff[i] & 0xff; /** to avoid sign extension */
printf("%02x",tmp);
}
}
И использовать это.
hexdump(back,len);
Если вам нужно записать его в память, вы можете использовать sprintf, но вам, возможно, придется написать свою собственную двоичную функцию в hex.
Использование нестандартных itoa
Функция, которая хранит значение в виде строки, вы можете сделать следующее:
char* hexstr = itoa(back,16);
// print out a string
printf("Decrypted Text: [%X]\n", back);