1

パディングからゼロを削除しようとしています。for ループを使用せずにゼロを削除したいのですが、パディングからゼロを削除するにはどうすればよいですか?

SymmetricPaddingExample.java コードは次のとおりです。

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
public class SimpleSymmetricPaddingExample{

public static void main(String[] args) throws Exception{
    String s = "HelloWorld";
    byte[] input = s.getBytes();

    byte[] keyBytes = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
                          0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e, 0x0f,
                          0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17};

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

    System.out.println("input: " + new String(input));

    //encryption
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];

    int ctLength = cipher.update(input, 0 , input.length, cipherText, 0);

    ctLength += cipher.doFinal(cipherText, ctLength);

    System.out.println("encrypted: " + new String(cipherText));

    //Decryption
    cipher.init(Cipher.DECRYPT_MODE, key);

    byte[] plainText = new byte[cipher.getOutputSize(cipherText.length)];

    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);

    ptLength += cipher.doFinal(plainText, ptLength);
    System.out.println("decrypted: " + new String(plainText));
}

}
4

2 に答える 2

1

PKCS7 パディングはゼロを追加しません。0x01、、0x0202などを追加します0x030303。パディングは、表示される前に復号化メソッドによって自動的に削除されます。

余分なゼロは、出力配列の最後に残った余分なバイトのようです。暗号テキストの長さにはパディングの長さが含まれ、復号化中に自動的に削除されます。復号化された平文はplainText[]配列の一部だけを埋め、最後にゼロバイトを残します。配列のサイズを正しく設定すると、追加のゼロは消えます。

于 2013-06-18T13:25:43.200 に答える
0

正規表現を使用してみてください。

String s = "somethingwithzeros0";
s.replaceAll("0*","");

または、この正規表現を使用して、文字列の末尾にあるゼロをフィルター処理できます。

s.replaceAll("0*$","");
于 2013-06-17T18:22:39.713 に答える