Как мне трактовать текстовое сообщение как числовое значение (для алгоритмов шифрования)? - PullRequest
0 голосов
/ 11 сентября 2010

Я изучаю криптографические алгоритмы и в процессе пытаюсь реализовать некоторые хорошо известные схемы. Я понимаю математические объяснения RSA и Эль-Гамаля, но в настоящее время не могу проверить мои реализации ни того, ни другого. Основная проблема заключается в том, что я не вижу способа конвертировать простой текст в число, которое можно манипулировать.

Например:

Message = "This is a message I want to encrypt";
int x = (int)Message;
Encrypt(x,key);

По-моему, должна быть возможность привести строку к целому числу, но выполнение метода, аналогичного приведенному выше, не работает. Как я могу преобразовать текстовое сообщение в числовое значение (а затем обратно в текстовое значение) для целей шифрования?

Ответы [ 3 ]

4 голосов
/ 12 сентября 2010

Обычно есть два шага для преобразования строки в целое число. Первый - преобразовать каждый символ в маленькое целое, а затем преобразовать полученную последовательность маленьких целых в большое целое. Например, в Java или C # вы можете легко преобразовать строку в байтовый массив, представляющий его кодировку UTF-8. Затем, обрабатывая массив байтов как целое число-256, вы можете преобразовать его в большое целое число. Каждый известный мне пакет BigInteger имеет конструктор, который будет принимать массив байтов, а также метод, который пойдет другим путем, возьмет BigInteger и вернет массив байтов.

3 голосов
/ 11 сентября 2010

Числа, используемые в Diffie-Hellman и RSA, действительно большие, поэтому библиотеки, которые их реализуют, работают со специализированными типами, которые могут представлять числа с тысячами битов. Приведение к int в лучшем случае будет содержать 32 или 64 бита.

Большинство из этих библиотек могут преобразовывать строку байтов в их большой целочисленный тип. Преобразование строки в большое целое число обычно требует промежуточного шага применения кодировки символов для преобразования строки символов в строку байтов.

0 голосов
/ 11 сентября 2010

Если вы действительно хотите преобразовать строку текста в числовое значение, вы можете просто добавить числовое значение ASCII для каждого символа.Это, конечно, не надежная контрольная сумма, и вы можете столкнуться с проблемами, если текст имеет более высокие значения Unicode.

В C вы можете сделать (быстро и грязно):

#include<stdio.h>
#include<string.h>

int main(){
 int k = 0;
 int value = 0;
 char text[]="this is a piece of text.";
 char c;
 for(k=0; k<strlen(text); k++){
   c = text[k];
   value = value + c;
   printf("char %c has value %d\n", c, c);
 }
 printf("total value is: %d\n", value);
 return 0;
}

Вывод:

char t has value 116
char h has value 104
char i has value 105
char s has value 115
char   has value 32
char i has value 105
char s has value 115
char   has value 32
char a has value 97
char   has value 32
char p has value 112
char i has value 105
char e has value 101
char c has value 99
char e has value 101
char   has value 32
char o has value 111
char f has value 102
char   has value 32
char t has value 116
char e has value 101
char x has value 120
char t has value 116
char . has value 46
total value is: 2147

Обратите внимание, что это ни в коем случае не безопасный и эффективный подход к обеспечению того, чтобы файл был тем, чем он должен быть (контрольная сумма).Если вы хотите, чтобы «значение» было присвоено данному потоку текста, попробуйте SHA-1 хеш-функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...