string param = "{\"idcard\":\"332529196209241717\",\"mobile\":\"13520507685\",\"name\":\"吴神木\"}";
 string key="1833ad3ad741456db435163fc5de7e76"
public static string AesEncrypt(string encryptStr, string key)
        {
            Byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(encryptStr);            RijndaelManaged rDel = new RijndaelManaged();
            rDel.Key = keyArray;
            rDel.Mode = CipherMode.ECB;
            rDel.Padding = PaddingMode.Zeros;            ICryptoTransform cTransform = rDel.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);            //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
            return ByteArrayToHexString(resultArray);
        }
java进行aes加密后的结果为:
AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88BAA010AC2B5F07748637792A50D97CEE
但是用C#加密后为:
3A53B8D4FC6667602A9F4C38B047668F5CDEE2A4F65B2E34E05ACF3D99FCA5965562FB12FA9F559C2428C840E7B094A7248AA533222F19A264586ABEA531CCE5D04D0CD8BA30D17545F056300A5A3B4B
java加密代码如下: public static String encode(String key, String data) {
        try {
            SecretKey secretKey = new SecretKeySpec(hex2bin(key), "AES");
            Cipher cipher = Cipher.getInstance("AES");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] bytes = cipher.doFinal(data.getBytes());
            return bin2hex(bytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
/**
 * 将2进制转换成16进制
 * 
 * @param bin
 *            2进制数组
 * @return 16进制字符串
 */
private static String bin2hex(byte[] bin) throws Exception {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < bin.length; i++) {
String hex = Integer.toHexString(bin[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
buf.append(hex.toUpperCase());
}
return buf.toString();
} /**
 * 将16进制转换为2进制
 * 
 * @param hex
 *            16进制字符串
 * @return 2进制数组
 */
private static byte[] hex2bin(String hex) throws Exception {
if (hex.length() < 1)
return null;
byte[] result = new byte[hex.length() / 2];
for (int i = 0; i < hex.length() / 2; i++) {
int high = Integer.parseInt(hex.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hex.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte) (high * 16 + low);
}
return result;
}

解决方案 »

  1.   

    同一个问题,你能反复发两次帖子也是服了你
    bin2hex
    hex2bin
    解密可以了,你居然还不会改加密?
      

  2.   

    static void Main(string[] args)
            {
                string param = "{\"idcard\":\"332529196209241717\",\"mobile\":\"13520507685\",\"name\":\"吴神木\"}";
                string key = "1833ad3ad741456db435163fc5de7e76";
                Console.WriteLine(AesEncrypt(param, key));
            }
            public static string AesEncrypt(string encryptStr, string key)
            {
                Byte[] keyArray = hex2byte(key);
                byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(encryptStr);            RijndaelManaged rDel = new RijndaelManaged();
                rDel.Key = keyArray;
                rDel.Mode = CipherMode.ECB;
                rDel.Padding = PaddingMode.Zeros;            ICryptoTransform cTransform = rDel.CreateEncryptor();
                byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);            //return Convert.ToBase64String(resultArray, 0, resultArray.Length);
                return BitConverter.ToString(resultArray).Replace("-", "");
            }
            static byte[] hex2byte(string str)
            {
                byte[] byteArray = new byte[str.Length / 2];
                for (int i = 0, k = 0; i < str.Length; i += 2, k++)
                {
                    byteArray[k] = (byte)Convert.ToInt16(str.Substring(i, 2), 16);
                }
                return byteArray;
            }
    要学会举一反三
      

  3.   

    data.getBytes()
    对应C#下的
    System.Text.Encoding.Default
      

  4.   

    如果涉及到非英文字符建议先转码(Unicode或其他你熟悉的编码)后再加密解密。
      

  5.   

    一般来说就是System.Text.Encoding.GetEncoding("gb2312")
      

  6.   

    java的byte和.net的表示范围不一样,你查一下
      

  7.   

    你把 C# 加密的结果,拿到 Java 里解密看看
      

  8.   

    主要是你的private key要对应上
      

  9.   

    @xuzuning 用java解不开,但是我用C#的就可以解开;
      

  10.   


     protected void Button8_Click(object sender, EventArgs e)
            {
                string data_aes_net = "AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88E8DAADA268ED8C6FE1E207FC6F9578D9";
                string data_aes_java= "AD15C6505362F5E88F92AE89854328CC097790DA1B7DD0361197A9039326239AC73E05605130A696BF99F8544B8BF8680681A29CA3E992D4122BF3ACAE51FC88BAA010AC2B5F07748637792A50D97CEE";
                string result_aes_net = AesDecrypt(data_aes_net, "1833ad3ad741456db435163fc5de7e76");
                string result_aes_java = AesDecrypt(data_aes_java, "1833ad3ad741456db435163fc5de7e76");
                Response.Write(result_aes_net+"<br>"+result_aes_java);
            }
    我用C#解密这2个字符串,得到同样的结果,但是用java,第一个就解密不了,第二个可以正常解密;
      

  11.   

    嗯,是充填方式的问题
    将 AesEncrypt 方法中的 
    rDel.Padding = PaddingMode.Zeros;
    改为
    rDel.Padding = PaddingMode.PKCS7;解码可以不改,因为 C# 要宽松的多(你的 data_aes_net 和 data_aes_java 都可正常解码)
      

  12.   

    这个两个参数不一致的问题 都搞成显式设置            rDel.Mode = CipherMode.ECB;
      rDel.Padding = PaddingMode.Zeros;
      

  13.   

    AES 是分组加密算法之一,它要求的加解密的数据长度是分组长度(对于 AES 是 16 字节)的整数倍。建议你采用流加密的工作方式,例如用 CBC 模式加密连续的 0x00 分组,得到足够长度的“流密钥”。截取与数据等长的流密钥:流密钥与明文异或,就得到密文;与密文异或就得到明文。无论加密还是加密,你都采用 AES 加密模式即可。上述实现,实际上是 AES 的 OFB 模式。
      

  14.   

    AES 是对称密码算法,不存在公钥和私钥,只有共享的秘密密钥。
      

  15.   

    UTF8Encoding.UTF8.GetBytes(encryptStr);
    改为
    System.Text.Encoding.GetEncoding("gb2312").GetBytes(encryptStr);一点动手能力都没?
      

  16.   

    public static String Encrypt(String str ,String key) { 
            try {  
             if (str == null || key == null) return null;
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes("utf-8"), "AES"));
                byte[] bytes = cipher.doFinal(str.getBytes("utf-8"));
                return new BASE64Encoder().encode(bytes);
            } catch (Exception e) {  
                e.printStackTrace();  
                return "";   
            }
        }