2014-11-05 2 views
0

Прямо сейчас у меня есть следующий код для Cesar Cipher, но я столкнулся с проблемой, когда пытаюсь шифровать текст с очень большим числом. Например 1000.Шифрование большими числами с использованием Caesar Cipher

static String encrypt(String plaintext) { 
    StringBuilder ciphertext = new StringBuilder(plaintext); 
    for (int i = 0; i < ciphertext.length(); i++) { 
     ciphertext.setCharAt(i, encrypt(ciphertext.charAt(i))); 
    } 
    return ciphertext.toString(); 
} 

static String decrypt(String plaintext) { 
    StringBuilder ciphertext = new StringBuilder(plaintext); 
    for (int i = 0; i < ciphertext.length(); i++) { 
     ciphertext.setCharAt(i, decrypt(ciphertext.charAt(i))); 
    } 
    return ciphertext.toString(); 
} 

static char encrypt(char c) { 
    return (char) ('!' + (c - '!' + 1000) % ('~' - '!' + 1)); 
} 

static char decrypt(char c) { 
    return (char) ('!' + (c - '!' - 1000) % ('~' - '!' + 1)); 
} 

Позволяет сказать, что я вход «ABC123» в шифровании, используя 1000 как мой ключ, я получаю кучу неизвестных символов. Имейте в виду, что я не хочу, чтобы он просто перебирал a-z, но символы тоже, используя коды ASCII.

Любая помощь будет замечательной!

+0

Ссылка на ASCII таблицы я использую: http://www.asciitable.com/ – Arman

+0

Так как вы только хотите отобразить на видимых символов ASCII, 126-33 + 1 = 94 возможных значений. Любая клавиша выше 93 будет иметь соответствующий меньший ключ, который будет делать то же самое. 95 будет шифровать то же самое, что и 1, 0 как 94 и т. Д., Поэтому большое значение, такое как 1000, не требуется. – ryanpattison

+0

@rpattiso Даже если я использую 93 вместо 1000, я все еще получаю неизвестные символы или невидимые символы. – Arman

ответ

1

В Java результат по модулю является тем же знаком, что и для дивиденда. Поэтому, когда вы вычисляете c - '!' - 1000, вы получите отрицательное значение, и после модуляции он будет по-прежнему отрицательным. Когда вы добавите '!', Вы будете вычислять значения, меньшие, чем '!', Которые будут невидимыми или недопустимыми для символа.

static char decrypt(char c) { 
    char d = '~' - '!' + 1; 
    int x = (c - '!' - 1000) % d; 
    if (x < 0) x += d; 
    return (char)('!' + x); 
} 

Описание Обсуждение проблемы, с которой вы столкнулись.

How does java do modulus calculations with negative numbers?

+0

Большое спасибо! Кстати, x должен быть int, и оператор return должен быть отправлен на char. Но он отлично работает, спасибо снова! – Arman

+0

Хороший улов, пожалуйста, нажмите на проверку, чтобы закрыть вопрос. – ryanpattison