2014-10-30 1 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

+0

Должен ли я размещать тот же вопрос в сообществах криптографии или биткойнов в stackoverflow? – user123

ответ

0

Что делать, если вы заменить явное приведение с этим:

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

Спасибо за ответ. Я получил некоторую ошибку, когда я попытался выполнить указанную выше строку в своем java-коде. java.security.spec.InvalidKeySpecException: несоответствующая ключевая спецификация: IOException: DerInputStream.getLength(): lengthTag = 111, тоже big.at sun.security.provider.DSAKeyFactory.engineGeneratePrivate (DSAKeyFactory.java:156) в java.security.KeyFactory .generatePrivate (KeyFactory.java:372) \t at Pgm.main (Pgm.java:61) – user123

+0

Если я создаю закрытый ключ с помощью DSA и сохранял его в файле после его зашифрования с использованием AES, должен ли я вернуть закрытый ключ из файл по расшифровке? – user123

2

Вы не можете просто преобразовать байтовый массив в экземпляр PrivateKey. Вы можете сгенерировать ключи KeyFactory

+1

Спасибо за предложение. KeyFactory дает мне новые ключи, не так ли? Но я хочу получить свои старые ключи, которые находятся в зашифрованном виде. Итак, вы говорите, что нет способа вернуть частный ключ из байта []? – user123

 Смежные вопросы

  • Нет связанных вопросов^_^