2013-04-10 104 views
3

我在java中實現RSA我遇到了一個代碼,下面給出了它在解密明文之後以數字形式顯示明文,但我希望它以簡單的英文輸入。我不想使用java api。使用java的RSA實現

TestRsa.Java

import java.io.IOException; 
import java.math.BigInteger; 
import java.util.Random; 

public class TestRsa { 

    private BigInteger p, q; 
    private BigInteger n; 
    private BigInteger PhiN; 
    private BigInteger e, d; 

    public TestRsa() { 
     initialize(); 
    } 

    public void initialize() { 
     int SIZE = 512; 
     /* Step 1: Select two large prime numbers. Say p and q. */ 
     p = new BigInteger(SIZE, 15, new Random()); 
     q = new BigInteger(SIZE, 15, new Random()); 
     /* Step 2: Calculate n = p.q */ 
     n = p.multiply(q); 
     /* Step 3: Calculate ø(n) = (p - 1).(q - 1) */ 
     PhiN = p.subtract(BigInteger.valueOf(1)); 
     PhiN = PhiN.multiply(q.subtract(BigInteger.valueOf(1))); 
     /* Step 4: Find e such that gcd(e, ø(n)) = 1 ; 1 < e < ø(n) */ 
     do { 
      e = new BigInteger(2 * SIZE, new Random()); 
     } while ((e.compareTo(PhiN) != 1) 
       || (e.gcd(PhiN).compareTo(BigInteger.valueOf(1)) != 0)); 
     /* Step 5: Calculate d such that e.d = 1 (mod ø(n)) */ 
     d = e.modInverse(PhiN); 
    } 

    public BigInteger encrypt(BigInteger plaintext) { 
     return plaintext.modPow(e, n); 
    } 

    public BigInteger decrypt(BigInteger ciphertext) { 
     return ciphertext.modPow(d, n); 
    } 

    public static void main(String[] args) throws IOException { 
     TestRsa app = new TestRsa(); 
     int plaintext; 
     System.out.println("Enter any character : "); 
     plaintext = System.in.read(); 
     BigInteger bplaintext, bciphertext; 
     bplaintext = BigInteger.valueOf((long) plaintext); 
     bciphertext = app.encrypt(bplaintext); 
     System.out.println("Plaintext : " + bplaintext.toString()); 
     System.out.println("Ciphertext : " + bciphertext.toString()); 
     bplaintext = app.decrypt(bciphertext); 
     System.out.println("After Decryption Plaintext : " 
       + bplaintext.toString()); 
    } 
} 
+2

-1張貼代碼,超過50%的空行。如果您希望人們閱讀您的代碼,則由您來決定是否可讀。 – EJP 2014-07-31 06:18:06

回答

1

嘗試這些行:

System.out.println("Plaintext : " + new String(bplaintext.toByteArray())); 
System.out.println("Ciphertext : " + new String(bciphertext.toByteArray())); 
bplaintext = app.decrypt(bciphertext); 
     System.out.println("After Decryption Plaintext : " + new String(bplaintext.toByteArray())); 
3

我RSA類:

package com.infovale.cripto; 

import java.io.UnsupportedEncodingException; 
import java.math.BigInteger; 
import java.security.InvalidKeyException; 
import java.security.KeyFactory; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.NoSuchAlgorithmException; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.spec.InvalidKeySpecException; 
import java.security.spec.PKCS8EncodedKeySpec; 
import java.util.Arrays; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.NoSuchPaddingException; 

public class RSA { 


static String kPublic = ""; 
static String kPrivate = ""; 

public RSA() 
{ 

} 


public String Encrypt(String plain) throws NoSuchAlgorithmException, 
     NoSuchPaddingException, InvalidKeyException, 
     IllegalBlockSizeException, BadPaddingException { 

    String encrypted; 
    byte[] encryptedBytes;  

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
    kpg.initialize(1024); 
    KeyPair kp = kpg.genKeyPair(); 

    PublicKey publicKey = kp.getPublic(); 
    PrivateKey privateKey = kp.getPrivate(); 

    byte[] publicKeyBytes = publicKey.getEncoded(); 
    byte[] privateKeyBytes = privateKey.getEncoded(); 

    kPublic = bytesToString(publicKeyBytes); 
    kPrivate = bytesToString(privateKeyBytes); 

    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
    encryptedBytes = cipher.doFinal(plain.getBytes()); 

    encrypted = bytesToString(encryptedBytes); 
    return encrypted; 

} 

public String Decrypt(String result) throws NoSuchAlgorithmException, 
     NoSuchPaddingException, InvalidKeyException, 
     IllegalBlockSizeException, BadPaddingException { 

    byte[] decryptedBytes; 

    byte[] byteKeyPrivate = stringToBytes(kPrivate); 

    KeyFactory kf = KeyFactory.getInstance("RSA"); 

    PrivateKey privateKey = null; 
    try { 

     privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(byteKeyPrivate)); 

    } catch (InvalidKeySpecException e) { 
     e.printStackTrace(); 
    } 

    String decrypted; 

    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.DECRYPT_MODE, privateKey); 
    decryptedBytes = cipher.doFinal(stringToBytes(result)); 
    decrypted = new String(decryptedBytes); 
    return decrypted; 

} 

public String bytesToString(byte[] b) { 
    byte[] b2 = new byte[b.length + 1]; 
    b2[0] = 1; 
    System.arraycopy(b, 0, b2, 1, b.length); 
    return new BigInteger(b2).toString(36); 
} 

public byte[] stringToBytes(String s) { 
    byte[] b2 = new BigInteger(s, 36).toByteArray(); 
    return Arrays.copyOfRange(b2, 1, b2.length); 
} 
} 
+3

op寫道:「我不想用java api」 – 2016-03-29 10:16:51