首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >stringToHex和hexToString C#和Android

stringToHex和hexToString C#和Android
EN

Stack Overflow用户
提问于 2014-01-15 20:19:35
回答 2查看 792关注 0票数 1

以下是整个故事:(1)我有字符串"123";(2)使用????g*Ox*??D#?\v加密为“EncryptFromBase64”;(3)使用ConvertStringToHex转换为十六进制字符串。

这是C#代码。

代码语言:javascript
运行
复制
       public string ConvertStringToHex(string asciiString)
    {
        string hex = "";
        foreach (char c in asciiString)
        {
            int value = Convert.ToInt32(c);
            // Convert the decimal value to a hexadecimal value in string form. 
            hex += String.Format("{0:X2}", value);
        }
        return hex;
    }

    public string ConvertHexToString(string HexValue)
    {
        string StrValue = "";
        while (HexValue.Length > 0)
        {
            StrValue += System.Convert.ToChar(System.Convert.ToUInt32(HexValue.Substring(0, 2), 16)).ToString();
            HexValue = HexValue.Substring(2, HexValue.Length - 2);
        }
        return StrValue;
    }
    public string Encrypt(byte[] encryptedData)
    {
        byte[] newClearData = rijndaelEncryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
        return Encoding.ASCII.GetString(newClearData);
    }

    public string EncryptFromBase64(string encryptedBase64)
    {
        if (encryptedBase64.Length < 1) return "";
        byte[] bytes = Encoding.ASCII.GetBytes(encryptedBase64);
        return Encrypt(bytes);
    }

(4)将十六进制字符串传输到Android命令到C# web服务,并将其转换为string。使用convertHexToString (5)使用decryptAsBase64。有填充异常。

这是android代码。

代码语言:javascript
运行
复制
    public String decryptAsBase64(String clearData) {
    if(clearData.length() < 1) return "";
    byte[] encryptedData = clearData.getBytes();        
    byte[] decryptedData = decryptAsBase64(encryptedData);
    String str = Base64.encodeBytes(decryptedData);
    str = str.replace("+", "%2B");
    return str;
}
public byte[] decryptAsBase64(byte[] clearData) {
    byte[] decryptedData =decrypt(clearData);
    try {
        return Base64.decode(decryptedData);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return decryptedData;
}
   public byte[] decrypt(byte[] clearData) {

    byte[] decryptedData;
    try {
        decryptedData = aesCipher_Decoder.doFinal(clearData);
    } catch (IllegalBlockSizeException e) {
        Log.e(TAG, "Illegal block size", e);
        return null;
    } catch (BadPaddingException e) {
        Log.e(TAG, "Bad padding", e);
        return null;
    }
    return decryptedData;
}       

公共字符串convertHexToString(字符串十六进制){

代码语言:javascript
运行
复制
      StringBuilder sb = new StringBuilder();
      //49204c6f7665204a617661 split into two characters 49, 20, 4c...
      for( int i=0; i<hex.length()-1; i+=2 ){

          //grab the hex in pairs
          String output = hex.substring(i, (i + 2));
          //convert hex to decimal
          int decimal = Integer.parseInt(output, 16);
          //convert the decimal to character
          sb.append((char)decimal);
      }
      return sb.toString();
    }

字符串转换回"????g*Ox*??D#?“是不正确的。

我的密码有什么问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-16 15:39:28

问题解决了。该错误出现在加密和解密代码中。以下代码

代码语言:javascript
运行
复制
 public string Encrypt(byte[] encryptedData)
 {
    byte[] newClearData = rijndaelEncryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
    return Encoding.ASCII.GetString(newClearData);
  }

应该是

代码语言:javascript
运行
复制
     public string Encrypt(byte[] encryptedData)
    {
        byte[] newClearData = rijndaelEncryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
     //   return Encoding.ASCII.GetString(newClearData);
        return Convert.ToBase64String(newClearData);
    }

在android解密代码中。密码

代码语言:javascript
运行
复制
  public String decryptAsBase64(String clearData) {
  if(clearData.length() < 1) return "";
  byte[] encryptedData = clearData.getBytes();        
  byte[] decryptedData = decryptAsBase64(encryptedData);
  String str = Base64.encodeBytes(decryptedData);
  str = str.replace("+", "%2B");
  return str;
}

应该是

代码语言:javascript
运行
复制
 public String decryptAsBase64(String clearData) {
    if(clearData.length() < 1) return "";
    byte[] encryptedData = null;
    try {
        encryptedData = Base64.decode(clearData);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    byte[] decryptedData = decrypt(encryptedData);
    String str = null;
    try {
        str = new String(decryptedData, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return str;
 }
票数 0
EN

Stack Overflow用户

发布于 2014-01-15 20:25:13

您在convertHexToString()方法中成对地获取十六进制字符,但是您的{0:X}格式字符串不一定每个字符输出两个十六进制数字。如果要确保每个字符都由两个十六进制数字表示,请使用此格式字符串:

代码语言:javascript
运行
复制
{0:X2}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21147368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档