Dies ist einfach zum Spaß. Dies wird nicht für eine tatsächliche Verschlüsselung verwendet. Ich bin erst im ersten Jahr comp sci Student und liebe Kryptographie.Einfache RSA-Verschlüsselung (Java)
Dies dauerte lange, bis es funktionierte. Bei ungefähr N = 18 beginnt es zu brechen. Nach diesem Punkt werden die Nachrichten nicht richtig verschlüsselt. Ich bin mir nicht sicher warum. Irgendwelche Einsichten? Ich würde auch alle Links schätzen, die Sie mir zu Tutorials oder interessanten Lektüren über Kryptographie zur Verfügung stellen könnten.
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;
}
}
Sie müssen konkreter sein, was Sie unter "Breakdown" verstehen, indem Sie Nachrichten nicht "richtig" verschlüsseln, und ob es mit N funktioniert. 18 Außerdem verwenden Sie RSA im ECB-Modus , während Sie ein hybrides Schema verwenden sollten. – crazyscot
Oh, und was Texte angeht - Cryptography Engineering von Schneier, Ferguson und Kohno. – crazyscot
Die Verschlüsselung funktioniert, aber die Entschlüsselung funktioniert nicht mit N> 18. Danke für den Lesevorschlag, ich werde es so schnell wie möglich aus der Bibliothek holen! –