2

文字列の暗号化と復号化について質問があります

暗号化された文字列をネットワーク経由で送信する必要があります(Androidアプリがクライアントです)これは私がこれまでに行ったことです

byte[] input = getByteArray(filePath);//get the message stored in a file as a byte array

いくつかのチュートリアルを経ることで、文字列メッセージをバイト配列に取得し、javax.cryptoを使用して暗号化することができました

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

暗号化されたメッセージはバイト配列として取得されます

byte[] encrypted

私は逆の方法を使用してそれを復号化し、メッセージを再度取得することさえできました

しかし、この暗号化されたバイト配列を(ネットワークを介して渡すために)文字列に変換してから、バイト配列に再変換しようとすると、問題が発生します

私はこれを試しました

String encryptedStrn = new String(encrypted); // convert to string

byte[]によってバイト配列に変換するときenc=cryptoStrn.getBytes();

このenc配列を使用して復号化しますが、出力が正しく表示されません。

変換に関するいくつかの基本的なことを見逃したことがありますか。私を助けてください。前もって感謝します

4

3 に答える 3

4

CodeInChaosがコメントで書いたように、String(byte[])不透明なバイナリデータから文字列を作成するためにコンストラクターを使用するべきではありません。文字列コンストラクターは、ASCII、UTF-8などのエンコードを使用してエンコードされたテキストデータを対象としています。暗号化の結果や画像ファイルなどの不透明なバイナリデータは、同じ方法でエンコードされたテキストデータではないため、情報を失うことになります。

代わりに、バイナリデータをASCIIにエンコードするbase64を使用する必要があります。このためのさまざまなサードパーティライブラリがあります。これには、優れたパブリックドメインライブラリが含まれます。または、AndroidではBase64クラスを使用することもできます。

さらに、実際のテキストをエンコードまたはデコードしているString.getBytes()場合でも、String(byte[])コンストラクターを使用しないでください。コンストラクターはプラットフォームのデフォルトのエンコードを使用しますが、これはほとんどの場合間違った選択です。CharSet代わりに、文字エンコーディングのまたは名前を明示的に取るオーバーロードを使用する必要があります。UTF-8は通常、両端を制御できる場合に使用するのに適したエンコーディングです。一方の端のみを制御している場合は、もう一方の端がどちらのエンコーディングを予期しているかを知る必要があります。

于 2012-06-30T08:13:17.307 に答える
0

暗号文をbase64でエンコードする必要があります。文字列に変換するだけではいけません。文字列はバイナリデータのコンテナではありません。

于 2012-06-30T08:13:35.037 に答える
0
    public string EncryptUser(string userID)
    {
        using (var cryptoProvider = new DESCryptoServiceProvider())
        using (var memoryStream = new MemoryStream())
        using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write))
        using (var writer = new StreamWriter(cryptoStream))
        {
            writer.Write(userID);
            writer.Flush();
            cryptoStream.FlushFinalBlock();
            writer.Flush();
            return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length);
        }
    }


    public string DecryptUserID(string userID)
    {
        using (var cryptoProvider = new DESCryptoServiceProvider())
        using (var memoryStream = new MemoryStream(Convert.FromBase64String(userID)))
        using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read))
        using (var reader = new StreamReader(cryptoStream))
        {
            return reader.ReadToEnd();
        }
    }
于 2014-04-01T08:20:02.660 に答える