1

私は数日間、javax.cryptoに関するこのチュートリアルと他のチュートリアルを読ん
でいます。Javaでのブロックモードと初期化ベクトルの使用

以下の私のテストコードは、サーバーにデータを送信するクライアントです。

さまざまなブロックモードについて読みましたが、任意のサイズのファイルをチャンクに分割したため、CFB8ストリームモードが機能しているようです。小さい最後のチャンクを除いて、すべてのチャンクは0.5MBであり、ファイルを元に戻すサーバーに次々に送信されます。

少し質問があります:

1)転送を開始する前に、非対称暗号化の公開鍵/秘密鍵を使用して、SecretKeySpecパスワードとIVをサーバーに送信する必要がありますか?

2)IVを保護するために使用されるSecretKeySpecパスワードは何ですか?

クライアントはデータを暗号化します

Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding"); 
SecretKeySpec keySpec = new SecretKeySpec("password12345678".getBytes(), "AES");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);

AlgorithmParameters params = cipher.getParameters();
byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();

out.write(iv); //Send IV to Server
out.flush();

// THE ENCRYPTET STREAM
cos = new CipherOutputStream(out, cipher);  

while ((val = byteArrayInputStream.read(buffer, 0, 1024)) > 0) {
       cos.write(buffer, 0, val);
       cos.flush();
}

cipher.doFinal()

サーバーはデータを復号化します

    byte[] iv = new byte[16];
    in.read(iv);

    Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding"); 
    SecretKeySpec keySpec = new SecretKeySpec("password12345678".getBytes(), "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

    cos = new CipherInputStream(in, cipher);        

   while (offset < tmpBuffer.length && (numRead=cos.read(tmpBuffer, offset,      tmpBuffer.length-offset)) >= 0) {
      offset += numRead;
      savedFileSize = savedFileSize + numRead;
   }    
   // CREATE HASH FROM THE DOWNLOAD CHUNK PART
   String retCrC = DoEncryption.getCRC32ChecksumFromArray(tmpBuffer);
   String hash2 = Long.toHexString( Long.parseLong(retCrC) );

   // TEST SO THE REMOTE HASH MATCH THE LOCAL HASH
   if(!hash1.equals(hash2)){
   ...
4

3 に答える 3

1

転送を開始する前に、非対称暗号化の公開鍵/秘密鍵を使用して、SecretKeySpecパスワードとIVをサーバーに送信する必要がありますか?

これは、SSLがどのように機能するかを大まかに示していますが、通常は逆です。代わりにSSL/TLSを使用できなかった理由は何ですか?独自の安全な転送プロトコルを生成することは簡単な作業ではありません。

于 2012-10-05T11:11:13.217 に答える
1

通常、IVをHMACに含めることでIVを保護します。

于 2012-10-05T13:37:10.530 に答える
0

質問の私の単純なコードを保護するために、SSL/TSLを使用できます。

こちらのブログから、SSL / TSLと自己署名証明書を使用してすべてが機能するようになりました:
@MarcusKrantzのブログ自己署名証明書の作成

私はこれが気弱な人のためではないと言わなければなりません..:)

ところで、*。bksファイルにkeytoolを使用する場合、bcprov-jdk15on-146のみが機能し、bcprov-jdk15on-147は機能しないというのは本当ですか?

于 2012-10-11T17:05:41.207 に答える