2012-04-18 111 views
0

我在下面的代码有问题。
我已经创建了两个方法ENCRYPTDECRYPT为RSA。为了获得公钥和私钥,我使用了keyGeneratorKeyPair来生成密钥。我们的前辈告诉我应该在我们使用它的地方调用KeyPair,它不应该在方法之前声明。需要RSA加密帮助

我试图创建密钥生成单独的方法,但是当我调用两种方法(ENCRYPTDECRYPT)这个方法,它会产生不匹配,因此解密是行不通的两个不同的密钥。

有人告诉我,创建构造函数,然后调用它的方法。我不知道如何称呼它以及它如何工作。

请大家看看下面我的代码和帮助我。谢谢。

public class Encryption 

{ 

static byte[] encrypted;  
public Encryption() throws NoSuchAlgorithmException, NoSuchProviderException 
{ 
    KeyPair keypair; 
    KeyPairGenerator keygenerator = KeyPairGenerator.getInstance("RSA"); 
    SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); 
    keygenerator.initialize(1024, random); 
    keypair = keygenerator.generateKeyPair(); 
} 

public String ENCRYPT(String Algorithm, String Data) throws Exception 
{ 
    String alg = Algorithm; 
    String data=Data; 
    if(alg.equals("RSA")) 
    { 
     stack enc=new stack(); 
     //Don't know how to call constructor here 
     PublicKey publicKey = keypair.getPublic(); 
     Cipher cipher; 
     cipher = Cipher.getInstance("RSA"); 
     cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
     encrypted = cipher.doFinal(data.getBytes()); 
     System.out.println("Encrypted String -> " + asHex(encrypted)); 
    } 

    return asHex(encrypted); 
} 
public String DECRYPT(String Algorithm, String Data) throws Exception 
{ 
String alg = Algorithm; 
String Decrypted=""; 
if(alg.equals("RSA")) 
{ 
    //have to call constructor here to get keypair value 
    PrivateKey privateKey = keypair.getPrivate(); 
    Cipher cipher; 
    cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.DECRYPT_MODE, privateKey); 
    byte[] dec = cipher.doFinal(encrypted); 
    Decrypted=new String(dec); 
    System.out.println("Decrypted String[RSA] -> " + Decrypted); 

} 

return Decrypted.toString(); 
} 
public static String asHex (byte buf[]) 
{ 
    StringBuffer strbuf = new StringBuffer(buf.length * 2); 
    int i; 
    for (i = 0; i < buf.length; i++) 
    { 
    if (((int) buf[i] & 0xff) < 0x10) 
    strbuf.append("0"); 
    strbuf.append(Long.toString((int) buf[i] & 0xff, 16)); 
    } 

    return strbuf.toString(); 
} 

} 
+0

如果你不知道如何Java的建设者的工作(包括事实,你不能命名它们从不同的类),我建议你读课本或[Java教程](http://docs.oracle的.com/JavaSE的/教程/ JAVA/index.html中)。 – 2012-04-18 02:53:57

+0

很高兴看到你修复了这个问题。 – 2012-04-18 02:54:50

+0

忘记更改构造函数名称 – Avinash 2012-04-18 02:59:20

回答

1

你想keypair是一个私有字段:

private KeyPair keypair; 

在构造函数初始化。初始化就是你已经有的:

keypair = keygenerator.generateKeyPair(); 

不要在构造函数中声明它为局部变量。

+0

出现错误“密钥对的非法修饰符”。 – Avinash 2012-04-18 03:03:29

+0

@ user1337792,字段在类中声明,但在任何方法之外。 – 2012-04-18 03:04:51

+0

起初,我也做了同样的方法之前使用它,但我的前辈告诉我,我已经宣布这些密钥对实例,其中我正好使用(在方法) – Avinash 2012-04-18 03:16:47