以下是整个故事:(1)我有字符串"123";(2)使用????g*Ox*??D#?\v加密为“EncryptFromBase64”;(3)使用ConvertStringToHex转换为十六进制字符串。
这是C#代码。
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代码。
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(字符串十六进制){
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#?“是不正确的。
我的密码有什么问题吗?
发布于 2014-01-16 15:39:28
问题解决了。该错误出现在加密和解密代码中。以下代码
public string Encrypt(byte[] encryptedData)
{
byte[] newClearData = rijndaelEncryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
return Encoding.ASCII.GetString(newClearData);
}
应该是
public string Encrypt(byte[] encryptedData)
{
byte[] newClearData = rijndaelEncryptor.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
// return Encoding.ASCII.GetString(newClearData);
return Convert.ToBase64String(newClearData);
}
在android解密代码中。密码
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 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;
}
发布于 2014-01-15 20:25:13
您在convertHexToString()
方法中成对地获取十六进制字符,但是您的{0:X}
格式字符串不一定每个字符输出两个十六进制数字。如果要确保每个字符都由两个十六进制数字表示,请使用此格式字符串:
{0:X2}
https://stackoverflow.com/questions/21147368
复制相似问题