Простое шифрование RSA (Java) - PullRequest
1 голос
/ 09 января 2011

Это просто для развлечения.Это не будет использоваться для любого фактического шифрования.Я только студент первого курса компьютерных наук и люблю криптографию.

Это заняло много времени, чтобы начать работать.Примерно при N = 18 он начинает разрушаться.После этого он не будет правильно шифровать сообщения.Я не уверен почему.Есть идеи?Я также был бы признателен за любые ссылки, которые вы могли бы предоставить мне на учебники или интересное чтение по криптографии.

import java.math.BigInteger;
import java.security.SecureRandom;

/**
 * Cryptography.
 *
 * Generates public and private keys used in encryption and 
 * decryption
 * 
 */
public class RSA
{
    private final static BigInteger one = new BigInteger("1");
    private final static SecureRandom random = new SecureRandom();

    // prime numbers
    private BigInteger p;
    private BigInteger q;

    // modulus
    private BigInteger n;

    // totient
    private BigInteger t;

    // public key
    private BigInteger e;

    // private key
    private BigInteger d;

    private String cipherText;

    /**
     * Constructor for objects of class RSA
     */
    public RSA(int N)
    {
        p = BigInteger.probablePrime(N/2, random);
        q = BigInteger.probablePrime(N/2, random);

        // initialising modulus
        n = p.multiply(q);

        // initialising t by euclid's totient function (p-1)(q-1)
        t = (p.subtract(one)).multiply(q.subtract(one));

        // initialising public key ~ 65537 is common public key
        e = new BigInteger("65537");
    }

    public int generatePrivateKey()
    {
         d = e.modInverse(t);
         return d.intValue();
    }

    public String encrypt(String plainText)
    {
        String encrypted = "";
        int j = 0;
        for(int i = 0; i < plainText.length(); i++){
            char m = plainText.charAt(i);
            BigInteger bi1 = BigInteger.valueOf(m);
            BigInteger bi2 = bi1.modPow(e, n);
            j = bi2.intValue();
            m = (char) j;
            encrypted += m;
        }
        cipherText = encrypted;
        return encrypted;
    }

    public String decrypt()
    {
        String decrypted = "";
        int j = 0;
        for(int i = 0; i < cipherText.length(); i++){
            char c = cipherText.charAt(i);
            BigInteger bi1 = BigInteger.valueOf(c);
            BigInteger bi2 = bi1.modPow(d, n);
            j = bi2.intValue();
            c = (char) j;
            decrypted += c;
        }
        return decrypted;
    }
}

1 Ответ

2 голосов
/ 09 января 2011

Ваше шифрование может быть тривиально нарушено, поскольку у вас есть только 2 ^ 16 разных сообщений. RSA безопасен только при использовании правильного заполнения (OEP). И, конечно же, зашифрованный текст занимает в 100 раз больше пространства, чем обычный текст, поскольку вы отображаете один символ на один блок RSA.

j = bi2.intValue();
m = (char) j;

Обе эти операции ужасно переполнены. bi2 является BigInteger по причине. Это просто не соответствует 32-битному целому / 16-битному символу. Так как усечение целого числа теряет большинство битов, дешифрование не будет работать, поскольку вы испортили шифротекст.

...