1

Java でテキストの暗号化をテストしています。問題は、行の先頭に奇妙な文字が表示され、その理由がわかりません。暗号化を削除すると、すべてがスムーズに進みます。

Notepad++ にコピーすると、出力は次のようになります。

Hello

<SOH>dear

<STX><STX>world

奇妙な制御文字が表示されるのはなぜですか?

コード:

public class Test {
        private static File file;
        private static final byte[] STAT_KEY = { -1, -2, 3, 4, -5, -6, -7, 8 };
        static {
            file = new File("MyFile.txt");
        }

        private static Cipher getCipher(int mode) throws InvalidKeyException, NoSuchAlgorithmException,
                InvalidKeySpecException, NoSuchPaddingException {
            DESKeySpec dks = new DESKeySpec(STAT_KEY);
            SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
            SecretKey desKey = skf.generateSecret(dks);
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(mode, desKey);
            return cipher;
        }

        private static void appendToFile(String item) throws Exception {
            CipherOutputStream cos = null;
            try {
                cos = new CipherOutputStream(new FileOutputStream(file, true), getCipher(Cipher.ENCRYPT_MODE));
                cos.write((item + String.format("%n")).getBytes());
            } finally {
                cos.close();
            }
        }

        private static void readFromFile() throws Exception {
            CipherInputStream cis = null;
            try {
                cis = new CipherInputStream(new FileInputStream(file), getCipher(Cipher.DECRYPT_MODE));
                int content;
                while ((content = cis.read()) != -1) {
                    System.out.print((char) content);
                }
            } finally {
                cis.close();
            }
        }

        public static void main(String[] args) throws Exception {
            String[] items = { "Hello", "dear", "world" };
            for (String item : items) {
                appendToFile(item);
            }
            readFromFile();
        }
    }

PD: 例外の扱い方ですみません :)

4

1 に答える 1

1

と同様にObjectOutputStreamCipherOutputStreamは直接追加できるようには記述されていません。

追加 (データ 1) + 追加 (データ 2) + 追加 (データ 3) != 追加 (データ 1 + データ 2 + データ 3)

データのさまざまなブロックを区切る独自の方法を追加する必要があります。変?な文字は、 によって使用されるプライベート コントロール文字CipherOutputStreamです。

Cipherデータを通常どおりに (つまり、オブジェクトを使用して) 暗号化し、出力を適切な区切り文字で囲んでファイルに書き込むと、作業が楽になります。

于 2013-04-09T14:19:07.097 に答える