关于Java和C#的Base64互用问题
本文以C#去适配Java,不去动Java代码;看结果直接翻到底
问题
最近和Java做对接,涉及AES加密解密,Java那边传递加密后的Base64字符,C#解密。但就是解不开,上网搜索查到了些内容,大致是C#和Java的Base64略有不一样
java部分如下
// Java代码
// 加密为base64字符
String base64EncodedCipherText= Base64.getUrlEncoder().encodeToString(decodedCipherText );
// 解密base64字符
byte[] decodedCipherText = Base64.getUrlDecoder().decode(base64EncodedCipherText);
C#原本如下 这是错误实例
// C#代码
// 加密为base64字符
string base64EncodedCipherText = Convert.ToBase64String(decodedCipherText );
// 解密base64字符
byte[] decodedCipherText = Convert.FromBase64String(base64EncodedCipherText );
我原以为C#也直接使用base64转byte就可以了,没想到一直提示非法的base64字符
输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。
加入两个Java与C#Base64转换方法
// C#代码
// C#的Base64转java的Base64
private static string Base64CsharpToJava(string base64EncodedCipherText)
{
char[] padding = { '=' };
string dummyData = base64EncodedCipherText.TrimEnd(padding).Replace('+', '-').Replace('/', '_');
return dummyData;
}
// java的Base64转C#的Base64
private static string Base64JavaToCsharp(string base64EncodedCipherText)
{
string dummyData = base64EncodedCipherText.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+").Replace("_", "/").Replace("-", "+");
if (dummyData.Length % 4 > 0)
{
dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
}
return dummyData;
}
C#修改后代码
// C#代码
// 加密为base64字符
string encodedDummyData = Convert.ToBase64String(decodedCipherText);
string base64EncodedCipherText= Base64CsharpToJava(encodedDummyData);
// 解密base64字符
string decodedDummyData = Base64JavaToCsharp(base64EncodedCipherText);
byte[] decodedCipherText = Convert.FromBase64String(decodedDummyData);