2013-09-12 7 views
2

Вот моя ошибкаJava Security - RSA Public Key & Private Key Code Issue

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=127, too big. 
    at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(Unknown Source) 
    at java.security.KeyFactory.generatePublic(Unknown Source) 
    at com.sanjaya.rsa.PublicKeyReader.get(PublicKeyReader.java:22) 
    at com.sanjaya.rsa.MainKeyClass.main(MainKeyClass.java:8) 
Caused by: java.security.InvalidKeyException: IOException: DerInputStream.getLength(): lengthTag=127, too big. 
    at sun.security.x509.X509Key.decode(Unknown Source) 
    at sun.security.x509.X509Key.decode(Unknown Source) 
    at sun.security.rsa.RSAPublicKeyImpl.<init>(Unknown Source) 
    at sun.security.rsa.RSAKeyFactory.generatePublic(Unknown Source) 
    ... 4 more 

Вот мой код - MAIN КЛАСС

public static void main(String[] args) { 
    PublicKeyReader publicKeyReader=new PublicKeyReader(); 
    try { 
     publicKeyReader.get("c:\\public.key"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    PrivateKeyReader privateKeyReader=new PrivateKeyReader(); 
    try { 
     privateKeyReader.get("c:\\private.key"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Вот открытый ключ, связанные с методом

public static PublicKey get(String filename) throws Exception { 
    File f = new File(filename); 
    FileInputStream fis = new FileInputStream(f); 
    DataInputStream dis = new DataInputStream(fis); 
    byte[] keyBytes = new byte[(int)f.length()]; 
    dis.readFully(keyBytes); 
    dis.close(); 
    X509EncodedKeySpec spec =new X509EncodedKeySpec(keyBytes); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    return kf.generatePublic(spec); 
    } 

метод приватного ключа

public static PrivateKey get(String filename)throws Exception { 
    File f = new File(filename); 
    FileInputStream fis = new FileInputStream(f); 
    DataInputStream dis = new DataInputStream(fis); 
    byte[] keyBytes = new byte[(int)f.length()]; 
    dis.readFully(keyBytes); 
    dis.close(); 
    PKCS8EncodedKeySpec spec =new PKCS8EncodedKeySpec(keyBytes); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    return kf.generatePrivate(spec); 
    } 

Пожалуйста, помогите мне разобраться в этом вопросе

Необходимость создания открытого ключа & закрытого ключа & зашифровать, расшифровать строку из тех, кто под RSA Encyption

+2

Возможно, неправильный формат файла. Как вы создали ключевые файлы? – Thilo

+0

его отправил третий участник. Но не смог открыть его в блокноте. - причина этой ошибки –

ответ

4
import java.io.BufferedInputStream; 
import java.io.BufferedOutputStream; 
import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.math.BigInteger; 
import java.security.Key; 
import java.security.KeyFactory; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.spec.KeySpec; 
import java.security.spec.RSAPrivateKeySpec; 
import java.security.spec.RSAPublicKeySpec; 
import javax.crypto.Cipher; 
import javax.crypto.CipherInputStream; 
import javax.crypto.CipherOutputStream; 

class RSA{ 

public static void main(String[] args) throws Exception { 
    generateKeys(); 
    rsaEncrypt("plaintext.txt", "encrypted.txt"); 
    rsaDecrypt("encrypted.txt", "decrypted.txt"); 
} 

public static void generateKeys() throws Exception { 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); 
    kpg.initialize(2048); 
    KeyPair kp = kpg.genKeyPair(); 
    PublicKey publicKey = kp.getPublic(); 
    PrivateKey privateKey = kp.getPrivate(); 

    System.out.println("keys created"); 

    KeyFactory fact = KeyFactory.getInstance("RSA"); 
    RSAPublicKeySpec pub = fact.getKeySpec(publicKey, 
      RSAPublicKeySpec.class); 
    RSAPrivateKeySpec priv = fact.getKeySpec(privateKey, 
      RSAPrivateKeySpec.class); 

    saveToFile("public.key", pub.getModulus(), pub.getPublicExponent()); 
    saveToFile("private.key", priv.getModulus(), priv.getPrivateExponent()); 

    System.out.println("keys saved"); 
} 

public static void saveToFile(String fileName, BigInteger mod, 
     BigInteger exp) throws IOException { 
    ObjectOutputStream fileOut = new ObjectOutputStream(
      new BufferedOutputStream(new FileOutputStream(fileName))); 
    try { 
     fileOut.writeObject(mod); 
     fileOut.writeObject(exp); 
    } catch (Exception e) { 
     throw new IOException("Unexpected error"); 
    } finally { 
     fileOut.close(); 
     System.out.println("Closed writing file."); 
    } 
} 

// Return the saved key 
static Key readKeyFromFile(String keyFileName) throws IOException { 
    InputStream in = new FileInputStream(keyFileName); 
    ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(
      in)); 
    try { 
     BigInteger m = (BigInteger) oin.readObject(); 
     BigInteger e = (BigInteger) oin.readObject(); 
     KeyFactory fact = KeyFactory.getInstance("RSA"); 
     if (keyFileName.startsWith("public")) 
      return fact.generatePublic(new RSAPublicKeySpec(m, e)); 
     else 
      return fact.generatePrivate(new RSAPrivateKeySpec(m, e)); 
    } catch (Exception e) { 
     throw new RuntimeException("Spurious serialisation error", e); 
    } finally { 
     oin.close(); 
     System.out.println("Closed reading file."); 
    } 
} 

// Use this PublicKey object to initialize a Cipher and encrypt some data 
public static void rsaEncrypt(String file_loc, String file_des) 
     throws Exception { 
    FileReader file = new FileReader("C://myprograms//plaintext.txt"); 
    BufferedReader reader = new BufferedReader(file); 
    String text = ""; 
    String line = reader.readLine(); 
    while(line!= null) 
    { 
     text += line; 
    line = reader.readLine(); 
    } 
    reader.close(); 
    System.out.println(text); 
    byte[] data = new byte[32]; 
    int i; 

    System.out.println("start encyption"); 
    Key pubKey = readKeyFromFile("public.key"); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.ENCRYPT_MODE, pubKey); 

    FileInputStream fileIn = new FileInputStream(file_loc); 
    FileOutputStream fileOut = new FileOutputStream(file_des); 
    CipherOutputStream cipherOut = new CipherOutputStream(fileOut, cipher); 

    // Read in the data from the file and encrypt it 
    while ((i = fileIn.read(data)) != -1) { 
     cipherOut.write(data, 0, i); 
    } 

    // Close the encrypted file 
    cipherOut.close(); 
    fileIn.close(); 

    System.out.println("encrypted file created"); 
} 

// Use this PublicKey object to initialize a Cipher and decrypt some data 
public static void rsaDecrypt(String file_loc, String file_des) 
     throws Exception { 
    byte[] data = new byte[32]; 
    int i; 

    System.out.println("start decyption"); 

    Key priKey = readKeyFromFile("private.key"); 
    Cipher cipher = Cipher.getInstance("RSA"); 
    cipher.init(Cipher.DECRYPT_MODE, priKey); 

    FileInputStream fileIn = new FileInputStream(file_loc); 
    CipherInputStream cipherIn = new CipherInputStream(fileIn, cipher); 
    FileOutputStream fileOut = new FileOutputStream(file_des); 

    // Write data to new file 
    while ((i = cipherIn.read()) != -1) { 
     fileOut.write(i); 
    } 

    // Close the file 
    fileIn.close(); 
    cipherIn.close(); 
    fileOut.close(); 

    System.out.println("decrypted file created"); 

} 
} 

Эта программа шифрует текст в незашифрованном .txt и сохраняет шифрованный текст в файле encrypted.txt. Аналогичным образом, дешифрование выполняется с использованием файла encrypted.txt, а обычный текст сохраняется в файле decrypted.txt. #

0

Проверьте символы новой строки файла сертификата! У меня был сертификат с символами новой строки Unix. Я пытался использовать градуировку, чтобы связать мой сертификат с WAR, и у меня также была градильня, чтобы некоторые замены строк были в файлах моей WAR. Тем не менее, gradle преобразовывал все, что он обрабатывал, в символы новой строки в стиле Windows. Это вызвало InvalidKeyException. Исключая мои файлы cert из обработки градации, исправлена ​​проблема:

webInf { 
    from myProjectFiles eachFile { projectFile 
     if (!projectFile.path.contains(myCertFiles) { 
      filter { line -> 
       line.replace(someKey, someValue) 
      } 
     } 
    } 
archiveName = 'myProject.war' 
Смежные вопросы