6

java.security と javax.crypto を使用して、Java でいくつかの整数を暗号化しようとしています。

問題は、Cipher クラスがバイト配列のみを暗号化することです。整数をバイト文字列に直接変換することはできません (できますか?)。これを行う最善の方法は何ですか?

整数を文字列に、文字列を byte[] に変換する必要がありますか? これは非効率的すぎるようです。

誰もそれを行うための迅速/簡単または効率的な方法を知っていますか?

私にお知らせください。

前もって感謝します。

jbu

4

7 に答える 7

12

次のように、DataOutputStream を使用して int を byte[] に変換できます。

ByteArrayOutputStream baos = new ByteArrayOutputStream ();
DataOutputStream dos = new DataOutputStream (baos);
dos.writeInt (i);
byte[] data = baos.toByteArray();
// do encryption

次に、後で復号化します。

byte[] decrypted = decrypt (data);
ByteArrayInputStream bais = new ByteArrayInputStream (data);
DataInputStream dis = new DataInputStream (bais);
int j = dis.readInt();
于 2008-11-26T19:10:17.967 に答える
9

変換に BigInteger を使用することもできます。

 BigInteger.valueOf(integer).toByteArray();
于 2008-11-26T19:14:28.443 に答える
5

NIOを使用するだけです。これは、この特定の目的のために設計されています。ByteBufferとIntBufferは、必要なことをすばやく、効率的に、そしてエレガントに実行します。ビッグ/リトルエンディアン変換、高性能IO用の「直接」バッファーを処理し、データ型をバイトバッファーに混在させることもできます。

整数をバイトに変換します。

ByteBuffer bbuffer = ByteBuffer.allocate(4*theIntArray.length);
IntBuffer ibuffer = bbuffer.asIntBuffer(); //wrapper--doesn't allocate more memory
ibuffer.put(theIntArray);                  //add your int's here; can use 
                                           //array if you want
byte[] rawBytes = bbuffer.array();         //returns array backed by bbuffer--
                                           //i.e. *doesn't* allocate more memory

バイトを整数に変換します。

ByteBuffer bbuffer = ByteBuffer.wrap(rawBytes);
IntBuffer ibuffer = bbuffer.asIntBuffer();
while(ibuffer.hasRemaining())
   System.out.println(ibuffer.get());      //also has bulk operators
于 2008-11-26T21:15:48.200 に答える
3

Java の Integer は常に 4 バイト長であるため、次のコードが役立つ可能性があります。

public static byte[] intToFourBytes(int i, boolean bigEndian) {  
    if (bigEndian) {  
        byte[] data = new byte[4];  
        data[3] = (byte) (i & 0xFF);  
        data[2] = (byte) ((i >> 8) & 0xFF);  
        data[1] = (byte) ((i >> 16) & 0xFF);  
        data[0] = (byte) ((i >> 24) & 0xFF);  
        return data;  

    } else {  
        byte[] data = new byte[4];  
        data[0] = (byte) (i & 0xFF);  
        data[1] = (byte) ((i >> 8) & 0xFF);  
        data[2] = (byte) ((i >> 16) & 0xFF);  
        data[3] = (byte) ((i >> 24) & 0xFF);  
        return data;  
    }  
}  

bigEndian パラメーターの詳細については、http: //en.wikipedia.org/wiki/Endiannessを参照してください。

于 2008-11-26T19:12:12.130 に答える
0

Pauloが言ったように、4バイト配列を作成し、ビット単位のANDとビットシフトを使用して4ステップでintを配列にコピーします。

ただし、AESやDESなどのブロックアルゴリズムは8バイトまたは16バイトのブロックで機能するため、アルゴリズムが必要とするものに配列をパディングする必要があることに注意してください。たぶん、8バイト配列の最初の4バイトを0のままにし、残りの4バイトには整数を含めます。

于 2008-12-22T22:50:38.947 に答える
0

使用するだけです:

    Integer.toString(int).getBytes();

元の int を使用していることを確認してください。 getBytes() はバイト配列を返します。他に複雑なことをする必要はありません。

元に戻すには:

    Integer.parseInt(encryptedString);
于 2015-06-23T15:09:44.707 に答える
0

私の簡単な解決策は、提供した秘密鍵で整数のASCII値をシフトすることにより、整数を文字列に暗号化することです。

解決策は次のとおりです。

public String encodeDiscussionId(int Id) {

    String tempEn = Id + "";
    String encryptNum ="";
    for(int i=0;i<tempEn.length();i++) {
        int a = (int)tempEn.charAt(i);
        a+=148113;
        encryptNum +=(char)a;
    }
    return encryptNum;
}

public Integer decodeDiscussionId(String encryptText) {

    String decodeText = "";
    for(int i=0;i<encryptText.length();i++) {
        int a= (int)encryptText.charAt(i);
        a -= 148113;
        decodeText +=(char)a;
    }
    int decodeId = Integer.parseInt(decodeText);
    return decodeId;
}

エンコードする手順:

  1. ここでは、まず、指定された整数を次の方法で文字列に変換します。String temp = givenInt + ""
  2. String の各文字をスキャンし、その文字の ASCII を読み取り、この場合は 148113 として秘密鍵を追加します。
  3. shift を Character に変換しInteger、に連結してString encryptNum、最後にそれを返します。

デコード手順:

  1. String の各文字をスキャンし、その文字の ASCII を読み取り、前と同様に秘密鍵で減算します。
  2. その値を文字に変換し、 で連結しdecodeTextます。

以前のエンコード出力は常にString '???'入力の桁数に応じて変化しますId

于 2018-07-01T15:42:28.073 に答える