2014-10-30 43 views
0

作爲項目實施的一部分,我做了以下幾件事: 1. Generete DSA密鑰 2.使用AES加密私鑰 3.保存到文件 4.打開文件並讀取加密的私鑰 5.我試圖將讀取的值轉換爲主鍵格式,但錯誤在這裏。 我在這裏附上上述步驟的代碼:如何將字節數組轉換爲DSA私鑰?

public class Pgm { 
public static void main(String[] args) { 
try { 
      KeyPairGenerator dsa = KeyPairGenerator.getInstance("DSA"); 
      SecureRandom random = new SecureRandom(); 
      dsa.initialize(1024, random); 
      KeyPair keypair = dsa.generateKeyPair(); 
      PrivateKey privateKey = (PrivateKey) keypair.getPrivate(); 
      byte[] key = "�u���1�iw&a".getBytes(); 
      Key aesKey = new SecretKeySpec(key, "AES"); 
      Cipher cipher = Cipher.getInstance("AES"); 
      String currentDir = System.getProperty("user.dir"); 
      // encrypt the text 
      cipher.init(Cipher.ENCRYPT_MODE, aesKey); 
      byte[] abc = privateKey.getEncoded(); 

      byte[] encrypted = cipher.doFinal(abc); 
      // System.out.println("len="+encrypted.length()); 
      File dir=new File(currentDir); 
      File private_file=new File(dir,"privatekey.txt"); 
      if(!private_file.exists()){ 
       private_file.createNewFile(); 
      } 
      FileOutputStream fileos = new FileOutputStream(private_file); 
      ObjectOutputStream objectos = new ObjectOutputStream(fileos); 
      objectos.writeObject(encrypted); 
      objectos.close(); 
      fileos.close(); 

      File file_private = new File(dir,"privatekey.txt"); 
      FileInputStream fileo = new FileInputStream(file_private); 
      ObjectInputStream objos = new ObjectInputStream(fileo); 
      Object obj = objos.readObject(); 
      byte[] encrypted1= (byte[])obj; 
      cipher.init(Cipher.DECRYPT_MODE, aesKey); 
      String decrypted = new String(cipher.doFinal(encrypted1)); 
      if (decrypted.equals(new String(abc))) 
       System.out.println("true"); 
      else 
       System.out.println("false"); 
      Signature tosign = Signature.getInstance("DSA"); 
      byte[] val = decrypted.getBytes(); 
      PrivateKey privatekey1 = (PrivateKey)val; 
      tosign.initSign(privatekey1); 

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

}

' PrivateKey privatekey1 = (PrivateKey)val;

顯示錯誤的不可兌換的類型

+0

生成密鑰而不是試圖轉換不兼容的類型。看看'KeyFactory'類。 – EJP 2014-10-30 09:12:16

+0

我應該在stackoverflow中的密碼學或比特幣社區中發佈相同的問題嗎? – user123 2014-11-11 05:48:05

回答

0

如果用這個代替明確鑄造什麼:

PrivateKey privateKey1 = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(val)); 
+0

謝謝你的回覆。我嘗試在我的java代碼中執行上面的代碼時遇到了一些錯誤。 java.security.spec.InvalidKeySpecException:不合適的密鑰規範:IOException:DerInputStream.getLength():lengthTag = 111,too.aton.security.provider.DSAKeyFactory.engineGeneratePrivate(DSAKeyFactory.java:156)at java.security.KeyFactory .generatePrivate(KeyFactory.java:372) \t at Pgm.main(Pgm.java:61) – user123 2014-10-30 09:53:13

+0

如果我使用DSA生成私鑰並在使用AES加密後將其保存在文件中,我應該從私鑰中獲取私鑰文件解密? – user123 2014-11-06 02:33:22

2

您不能簡單地將字節數組轉換爲PrivateKey實例。 您可以通過KeyFactory

+1

謝謝您的建議。 KeyFactory爲我提供了新的密鑰,對吧?但我想讓我的舊密鑰以加密形式出現。所以你說的就像沒有辦法從byte []中取回私鑰? – user123 2014-10-30 09:48:53

相關問題