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 件
はい、これは正常な動作です。
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);
暗号化の出力は想定された ランダムなゴミのように見えます。読みやすい場合は、誰かがそれを微調整して(たとえばBASE64エンコーディングで)見えるようにするか、何かがおかしくなったかのいずれかです。
また、出力はバイナリストリームです。
String
に変換するためのものではありません テキストではないため、印刷されます。したがって、この行:
暗号化されたデータを取得し、UTF-8テキストとして解釈しようとします。しかし、これはUTF-8テキストではないため、奇妙な出力が得られます。