2

次のコードがあります。

グローバル

public static PublicKey pubKey;
public static PrivateKey privKey;
public static Cipher cip;

主要

public static void main(String[] args) throws Exception {
    //Generate the keys

    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(1024);
    KeyPair kp = kpg.genKeyPair();
    Key publicKey = kp.getPublic();
    Key privateKey = kp.getPrivate();

    KeyFactory fact = KeyFactory.getInstance("RSA");
    cip = Cipher.getInstance("RSA/ECB/NoPadding");

    // Store Public Key.

    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(
            publicKey.getEncoded());
    FileOutputStream fos = new FileOutputStream("public.key");
    fos.write(x509EncodedKeySpec.getEncoded());
    fos.close();

    // Store Private Key.
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
            privateKey.getEncoded());
    fos = new FileOutputStream("private.key");
    fos.write(pkcs8EncodedKeySpec.getEncoded());
    fos.close();

    //Get the public and private keys out of their files
    getPubAndPrivateKey();

    //Check if the keys gotten out of the files are the same as the generated files (this returns truetrue)
    System.out.print(publicKey.equals(pubKey));
    System.out.print(privateKey.equals(privKey));


    byte[] text = "This is my super secret secret".getBytes();
    encryptToFile("encrypted.txt", text );
    decryptToFile("encrypted.txt", "decrypted.txt");

}

ファイルからキーを取得する

private static void getPubAndPrivateKey() throws IOException, Exception {
    // Read Public Key.
    File filePublicKey = new File("public.key");
    FileInputStream fis = new FileInputStream("public.key");
    byte[] encodedPublicKey = new byte[(int) filePublicKey.length()];
    fis.read(encodedPublicKey);
    fis.close();

    // Read Private Key.
    File filePrivateKey = new File("private.key");
    fis = new FileInputStream("private.key");
    byte[] encodedPrivateKey = new byte[(int) filePrivateKey.length()];
    fis.read(encodedPrivateKey);
    fis.close();

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(
            encodedPublicKey);
    pubKey = keyFactory.generatePublic(publicKeySpec);

    PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(
            encodedPrivateKey);
    privKey = keyFactory.generatePrivate(privateKeySpec);

}

暗号化

    public static void encryptToFile(String fileName, byte[] data)
        throws IOException {

    try {
        cip.init(Cipher.ENCRYPT_MODE, privKey);
        byte[] cipherData = cip.doFinal(data);
        String encryptedData = cipherData.toString();
        BufferedWriter out = new BufferedWriter(new FileWriter(fileName));
        out.write(encryptedData);
        out.close();

    } catch (Exception e) {
        throw new RuntimeException("Spurious serialisation error", e);
    }

}

復号化

private static void decryptToFile(String string, String string2)
        throws Exception {

    try {
        File encryptedFile = new File("encrypted.txt");

        byte[] encrypted = getContents(encryptedFile).getBytes();

        cip = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cip.init(Cipher.DECRYPT_MODE, pubKey);

        byte[] cipherData = cip.doFinal(encrypted);

        String decryptedData = cipherData.toString();
        BufferedWriter out = new BufferedWriter(new FileWriter(
                "decrypted.txt"));
        out.write(decryptedData);
        out.close();

    } catch (Exception e) {
        throw e;
    }
}

すでに確認したこと

  • 復号化に使用されるデータは、暗号化されたファイルと同じです
  • 生成されたキーは、ファイルから取得したものと同じです
  • 暗号化と復号化の両方でエラーが発生しません

結果
元の文字列:
My super secret secret
暗号化の結果:
[B@1747b17 復号化の結果: [B@91a4fb

4

2 に答える 2

3

メソッドを介してバイト配列を出力するtoString()と、コンテンツから完全に独立した値が得られます。

したがって、値 [B@1747b17 [B@91a4fb] は、何も教えてくれないただのゴミです。

バイト配列の内容を出力したい場合は、Base64 または 16 進文字列に変換してください。

System.out.println(new sun.misc.BASE64Encoder().encode(myByteArray)); 

16 進文字列は、 Apache Commons Codec ライブラリの org.apache.commons.codec.binary.Hex を使用して生成できます。

于 2012-07-04T15:16:49.403 に答える
1

私は上記の答えに同意します。あなたの場合、FileOutputStreamを使用して、バイトをファイルに書き込むことができます-例:

public static void encryptToFile(String fileName, byte[] data)
        throws IOException {

    FileOutputStream out = null;
    try {
        cip.init(Cipher.ENCRYPT_MODE, privKey);
        byte[] cipherData = cip.doFinal(data);
        out  = new FileOutputStream(fileName);
        out.write(cipherData);
    } catch (Exception e) {
        throw new RuntimeException("Spurious serialisation error", e);
    } finally {
       if (fos != null) {
           try {
              fos.close();
           } catch (IOException ex) {
           }
       }
    }

}
于 2012-07-05T07:39:23.807 に答える