6

我正在尝试使用 java.security 和 javax.crypto 在 java 中加密一些整数。

问题似乎是 Cipher 类只加密字节数组。我不能直接将整数转换为字节字符串(或者我可以吗?)。做这个的最好方式是什么?

我应该将整数转换为字符串并将字符串转换为字节 [] 吗?这似乎太低效了。

有谁知道快速/简单或有效的方法?

请告诉我。

提前致谢。

吉布

4

7 回答 7

12

您可以使用 DataOutputStream 将整数转换为 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

创建一个 4 字节数组并分 4 步将 int 复制到数组中,如 Paulo 所说,使用按位与和位移。

但请记住,诸如 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. 转换Integer为 Character 并连接到 theString encryptNum并最终返回它。

解码步骤:

  1. 扫描字符串的每个字符,读取该字符的 ASCII 并用之前的密钥减去它。
  2. 将该值转换为字符并与decodeText.

由于先前的编码输出总是String '???'根据输入的位数而变化Id

于 2018-07-01T15:42:28.073 回答