私はこの件についてほぼすべてのトピックを検索しましたが、何が間違っているのかまだ分かりません。私はあなたのアンドロイドアプリに3 EditText
を作成しました: EditText
暗号化と復号化のために鍵/パスワードを挿入する場所です。 EditText2
暗号化されたテキストが表示されます。 EditText3
解読されたテキストが表示されます。暗号化/復号化のためのアンドロイドスタジオのブローフィッシュ
まだ初期のテストであるため、私はメッセージや文字列をアプリで変数としてCryptに入れました。
問題は、暗号化されたフクロウのアルゴリズムのようなものを与えるので、問題はありません(2 ==で終わるので、正しく動作していると思います)。私はまた、解読の前に文字列を解読しようとしました。あるいは、良い結果を出さずに暗号化から生のbyte[]
を使用しました。復号化は、元の文字列テキストを戻すのではなく、暗号化されたテキストよりも大きなものを与えます。私はブローフィッシュのモードを好みませんので、Blowfish/CFB/NoPaddingとして簡単に始めました。
str_key
,str2
およびstr3
は現在公表されている。 str2
はEditText2
フィールドのテキストを設定し、str3
はEditText3
フィールドのテキストを設定します。出力の 例:ここでは
public void encrypt(){
//encrypt
EditText mEdit = (EditText)findViewById(R.id.editText);
str_key = (String) mEdit.getText().toString();
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength/8;
SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt,
iterationCount, keyLength);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] keyBytes = new byte[0];
try {
keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");
Cipher cipher = null;
try {
cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
if (cipher == null || key == null) {
//throw new Exception("Invalid key or cypher");
str2="error";
}
else {
byte[] iv = new byte[cipher.getBlockSize()];
random.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
try {
cipher.init(Cipher.ENCRYPT_MODE, key,ivParams);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
try {
raw = cipher.doFinal(message.getBytes("UTF-8"));
} catch (IllegalBlockSizeException | BadPaddingException | UnsupportedEncodingException e) {
e.printStackTrace();
}
str2 = Base64.encodeToString(raw,Base64.DEFAULT);
}
}
は、復号化機能である:ここで
Example of output generated from the app
はコードだ
public void decrypt(){
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength/8;
SecureRandom random = new SecureRandom();
byte[] salt = new byte[saltLength];
random.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(str_key.toCharArray(), salt, iterationCount, keyLength);
SecretKeyFactory keyFactory = null;
try {
keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] keyBytes = new byte[0];
try {
keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
SecretKey key = new SecretKeySpec(keyBytes, "Blowfish");
Cipher cipher2 = null;
try {
cipher2 = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");
} catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
e.printStackTrace();
}
iv = new byte[cipher2.getBlockSize()];
random.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
try {
cipher2.init(Cipher.DECRYPT_MODE, key, ivSpec);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
e.printStackTrace();
}
byte[] decryptedBytes = null;
byte[] app= Base64.decode(str2,Base64.DEFAULT);
try {
decryptedBytes = cipher2.doFinal(app);
} catch (IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
str3 = Base64.encodeToString(decryptedBytes,Base64.DEFAULT);
}
ありがとうございました。また、base64デコードを使用しようとしました。また、元の "pre"エンコードされたバイト配列を使用して、結果を得ることなく解読しました。私は何をすべきかの例を挙げることができますか? KDF.PBKDF2でUTF-8を変更するだけでいいですか? 私はまたIVを次のように生成しようとしました:IvParameterSpec ivSpec =新しいIvParameterSpec(keySpec.getEncoded()); //解読関数の中で; 実行時エラーが発生します。これについても私に例を教えていただけますか? – Micene
HMACを使用して暗号テキストを変更しないようにするにはどうすればよいですか? – Micene
これはあなたがgoogleの検索できるすべてのものです、私はちょうどあなたのためのコードを書く場合は何も学ぶことはありません!あなたがbase64をデコードしてみてもそれを試してみたら、ちょうど間違ったことをしただけです。元の投稿のコードを試したものに編集してみてください。私はそこからお手伝いします。 –