bugfix> java > 投稿

results_screenshot_image

byte[] originalMessage = MESSAGE.getBytes();
System.out.println("Byte[]: " + Arrays.toString(originalMessage));
System.out.println("Original: " + MESSAGE);
EnDat newEncryption = new EnDat(KEY);
byte[] encryptedTemp = newEncryption.getEncryptMessage(originalMessage);
System.out.println("Byte[]: " + Arrays.toString(encryptedTemp));
System.out.println("Encrypted: " + new String(encryptedTemp,0,encryptedTemp.length,StandardCharsets.UTF_8));
byte[] decryptedTemp = newEncryption.getDecryptMessage(encryptedTemp);
System.out.println("Byte[]: " + Arrays.toString(decryptedTemp));
System.out.println("Decrypted: " + new String(decryptedTemp,0,decryptedTemp.length,StandardCharsets.UTF_8));


public byte[] getEncryptMessage(byte[] msg) throws Exception {
    if(DEBUG_MODE) System.out.println(">>>ADDRESS: " + msg );
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKey secretKey = new SecretKeySpec(keyVal, ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    return cipher.doFinal(msg);
}


public byte[] getDecryptMessage(byte[] encryptedMsg) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
    SecretKey secretKey = new SecretKeySpec(keyVal, ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    if(DEBUG_MODE) System.out.println(">>>ADDRESS: " + encryptedMsg );
    return cipher.doFinal(encryptedMsg);
}

以前はほとんど暗号化を行っていなかったので、JavaのCipherクラスで試しましたが、暗号化されたメッセージに疑問符が付いたダイヤモンドのような文字(負のchar値があった)以外はすべて正常に動作することがわかりました。暗号化は正常ですか、それともコードに何か問題がありますか?

回答 2 件
  • 暗号化の出力は想定された ランダムなゴミのように見えます。読みやすい場合は、誰かがそれを微調整して(たとえばBASE64エンコーディングで)見えるようにするか、何かがおかしくなったかのいずれかです。

    また、出力はバイナリストリームです。 String に変換するためのものではありません  テキストではないため、印刷されます。

    したがって、この行:

    new String(encryptedTemp,0,encryptedTemp.length,StandardCharsets.UTF_8)
    
    

    暗号化されたデータを取得し、UTF-8テキストとして解釈しようとします。しかし、これはUTF-8テキストではないため、奇妙な出力が得られます。

  • はい、これは正常な動作です。

    Javaは、文字を印刷するためのエンコードとしてUnicodeを使用します。メッセージを暗号化すると、そのメッセージはバイナリ レベルではなく「有効な文字」 レベル。つまり、暗号化されたデータに文字以外の値を含めることができます(そして一般的です)。それらを印刷しようとすると、-シンボルが表示されます。

    used to replace an unknown, unrecognized or unrepresentable character

    ウィキペディアから


    暗号化されたデータを表示したい場合は、データをファイルに保存することで確認できます(たとえば、 java.io.FileOutputStream を使用して )、バイナリまたは16進値を表示できるプログラムで開きます。
    Sublime Textをお勧めします。バイナリファイルを自動的に認識し、そのように表示します。

    FileOutputStream fos = new FileOutputStream("pathname");
    fos.write(encryptedByteArray);
    
    

あなたの答え