情景:java对byte[]做^实现加密,C对Char[]做^运算来解密。
错误:
加密,java中对原文转换成byte数组,然后做^运算,这个过程中将返回结果做了一次new String(),得到加密结果。
解密,getBytes()拿到密文,然后做^运算,打印发现结果不是原文了。
原因,new String()会抛弃编码中不存在的byte,处理latin1编码兼容所有的。故去掉中间new String()的步骤就可以了。
/**
* 加密
* @param str
* @param srclen
*/
public static byte[] cbt_crypt(String str, int srclen) {
int i;
int j=0;
String tmp = "badboy_blue";
byte[] key = tmp.getBytes();
byte[] stri = str.getBytes();
for (i=0;i<srclen;i++){
stri[i]^=key[j];
j=(j+1)%8;
}
return stri;
}
/**
* 解密
* @param str
* @param srclen
* @param pos
* @return
*/
public static byte[] cbt_crypt(byte[] str, int srclen, int pos)
{
int i;
int j=pos%8;
String tmp = "badboy_blue";
byte[] key = tmp.getBytes();
for (i=0;i<srclen;i++) {
str[i]^=key[j];
j=(j+1)%8;
}
return str;
}
另外附个byte[]和String之间转换信息丢失的问题:
http://blog.csdn.net/xiongyucai/archive/2008/05/23/2472662.aspx
分享到:
相关推荐
这段代码首先创建一个`ByteArrayOutputStream`对象用于存放结果,然后遍历十六进制字符串,每两个字符表示一个字节,通过位运算转换为字节值并添加到`ByteArrayOutputStream`中。 #### 四、byte[]到十六进制String...
### Java中的位运算 #### 一、概述 位运算(Bitwise Operators)是计算机科学中的一个基础概念,它直接作用于二进制位上。在Java语言中,位运算符可以应用于所有整型数据类型,如`long`、`int`、`short`、`char`和...
### JAVA位运算详解 在Java编程中,位运算是一门精细的艺术,涉及到对整数类型的二进制位进行直接操作。这些操作不仅能够优化代码执行效率,还常用于实现特定的算法需求。本文将深入探讨Java中的位运算,包括位...
在计算机科学中,十六进制(Hexadecimal)是一种逢16进1的进位制,通常用于表示二进制数据,因为每个十六进制数字可以代表4...通过理解其原理并掌握在Java中的实现方式,我们可以更有效地解决各种与位运算相关的问题。
- 遍历输入数组`b`,对于每一个`byte`,先通过位运算`& 0xFF`确保只考虑低八位有效值,然后调用`Integer.toHexString()`方法将其转换为十六进制字符串。 - 如果转换得到的字符串长度为1,则在其前面添加一个"0"以...
- **10进制byte数组**:在计算机中,byte是数据的基本单位,它通常代表8位二进制。10进制byte数组是包含多个字节的序列,每个字节可以是0到255的10进制值。 2. **Go语言中的转换方法** - **使用`hex`包**:Go的...
下面我们将详细讨论`switch`语句对`byte`、`long`和`String`的支持情况。 首先,对于`byte`类型,由于`byte`可以直接隐式转换为`int`类型,因此在`switch`语句中是可以使用的。这意味着如果你有一个`byte`变量,你...
public static String bytesToHex(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { // 将字节转换为16进制的两个字符 int halfByte = (b & 0xF0) >> 4; int byteVal = (b & ...
包含MD5加密,同时拥有多种方式进行byte或者byte[]与16进制相互转换 三种方式: 方式一:Integer.toHexString(int) 对应的是: Integer.parseInt(String, int)或者Integer...方式二:位运算(& 与 |) 方式三:算术运算
这个方法首先逐个提取字节,并通过位移和按位或运算将它们组合成一个`int`,然后与0xFFFFFFFFL进行按位与操作,以确保结果始终为32位无符号整数。 对于`short`到`byte`数组的转换,`shortToByteArray`方法将16位的`...
在进行位运算时,Java会将byte类型自动扩展为int类型进行操作,这是因为byte的范围较小,位运算需要更大的数据类型来容纳结果。 以下是一个将4字节数组转换为有符号整数的方法: ```java int ByteToSignedInt(byte...
大整数运算是计算机科学和数学中一个重要的研究方向,许多应用场景都需要高精度的计算,例如精确到100位的小数的黄金分割系数计算、大素数问题、梅森素数问题等。Java提供的BigInteger类可以较好地解决这些问题。...
使用位运算、值交换等方式反转java字符串(四种方法) 在 Java 中,字符串反转是非常常见的操作,今天我们将介绍四种不同的方法来反转 Java 字符串,包括使用位运算、值交换等方式。 1. 使用 StringBuilder 的 ...
在数据运算方面,Java支持算术运算、关系运算、逻辑运算、位运算和赋值运算。算术运算包括加法(+)、减法(-)、乘法(*)、除法(/)、取模(%)等。关系运算符如大于(>)、小于(<)、等于(==)等用于比较两个...
- `float`:占用4字节,提供约7位有效数字精度,通常用于需要小数点计算但对精度要求不高的场景。 - `double`:占用8字节,精度高于`float`,默认浮点型。 3. **字符型**: - `char`:占用2字节,表示单个字符,...
本文将深入探讨高精度运算的基本概念、涉及的问题及一个具体的高精度加法的实现方法。 首先,我们要了解不同数据类型及其数值范围。在常见的编程语言中,有如下几种基本的数据类型: 1. 字节(Byte):0 .. 255,...
注意,由于`byte`类型的范围是 `-128` 到 `127`,在进行位运算时可能会丢失高8位,因此需要使用`& 0xff`来保留低8位。 ### 方法二:使用`DataInput`和`DataOutput`流 ```java public static void main(String[] ...
private static byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv, DESCryptoServiceProvider des) { // 加密逻辑 } } ``` 对于RC2算法,代码结构类似,只需将DESCryptoServiceProvider...
2. 高效计算:位操作通常比算术运算更快,例如通过位运算快速求两数最大公约数和最小公倍数。 3. 数字掩码:通过位与操作,可以方便地检查或设置特定位,如权限控制、颜色编码等。 4. 位翻转:通过按位异或操作,...
为了解决上述问题,本节将介绍一种基于位运算的简单自定义加密方法。这种方法的核心在于利用C#中的按位运算符(`&`、`|` 和 `^`)来实现加密和解密过程。 ##### 位运算基础 - **按位与运算(`&`)**:两个对应的二...