2012-04-18 14 views
0

私は以下のコードで問題があります。
RSAの2つの方法ENCRYPTDECRYPTを作成しました。公開鍵と秘密鍵を取得するために、鍵を生成するのにkeyGeneratorKeyPairを使用しました。私たちのシニアは、KeyPairは私たちがそれを使うところで呼び出さなければならないと言っていました。メソッドの前に宣言してはいけません。はRSA暗号化のヘルプが必要

私はキー生成のための別のメソッドを作成しようとしましたが、両方のメソッド(ENCRYPTDECRYPT)でそのメソッドを呼び出すと、復号化に一致しない2つの異なるキーが生成されます。

私はコンストラクタを作成し、それをメソッドで呼び出すように指示されています。どのように正確にそれを呼び出すのか、それがどのように機能するのかはわかりません。

以下のコードを参考にしてください。ありがとうございました。

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/)を読むことをお勧めします。 .com/javase/tutorial/java/index.html)。 –

+0

あなたはそれを修正してくれてありがとう。 –

+0

コンストラクター名を変更するのを忘れた – Avinash

答えて

1

あなたはkeypairがプライベートフィールドになりたい:コンストラクタで初期化さ

private KeyPair keypair; 

。初期化はあなたが既に持っているものです:

keypair = keygenerator.generateKeyPair(); 

コンストラクタのローカル変数として宣言しないでください。

+0

は、「キーペアの不正な修飾子」というエラーを受け取りました。 – Avinash

+0

@ user1337792では、フィールドはクラス内で宣言されていますが、メソッドの外部には宣言されていません。 –

+0

最初は同じ方法を使用しましたが、メソッドの前に使用しましたが、私のシニアは、私がキーのインスタンスを宣言しなければならないと教えてくれました。(メソッドで) – Avinash