我正在使用客户端/服务器系统,并且正在尝试进行一些基本的加密。当我连接到服务器时,我将公钥作为转义的字符串通过套接字发送。我已经验证了字符串在两端,换行符和所有字符串上都是
相同的 。
在客户端(Android)上,我可以使用公钥/私钥成功加密和解密秘密密钥(出于测试目的)。但是,当尝试将公共密钥从String解码为byte
[]时,服务器立即无法通过以下操作失败:
java.lang.IllegalArgumentException: Illegal base64 character a
如果我理解正确的话,这似乎很荒谬,因为“ a”绝对是base64字符。客户端和服务器使用共享库来处理所有加密,因此代码几乎相同。的 唯一
差别是编码/解码的base64字符串,由于java.util.Base64是在Android不可用。
共享类
public abstract class EasyCrypt {
...
public PublicKey loadPublicKey(String key64) throws GeneralSecurityException {
byte[] data = decode(key64); //Calls abstract methods, shown below
X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
KeyFactory fact = KeyFactory.getInstance("RSA");
return fact.generatePublic(spec);
}
...
}
客户端(Android)方法
import android.util.Base64;
public class ClientCrypt extends EasyCrypt {
@Override
protected byte[] decode(String s) {
return Base64.decode(s.getBytes(), Base64.DEFAULT); //Works perfectly
}
@Override
protected String encode(byte[] bytes) {
return Base64.encodeToString(bytes, Base64.DEFAULT);
}
}
服务器(Linux)方法
import java.util.Base64;
public class ServerCrypt extends EasyCrypt{
@Override
public byte[] decode(String str){
return Base64.getDecoder().decode(str); //Throws IllegalArgumentException
}
@Override
public String encode(byte[] bytes){
return Base64.getEncoder().encodeToString(bytes);
}
}
在android上,使用Base64.NO_WRAP
代替Base64.DEFAULT
@Override
protected String encode(byte[] bytes) {
return Base64.encodeToString(bytes, Base64.NO_WRAP);
}
我知道,有很多关于这个主题的线索--我读过大部分,但没有一个给我正确的答案。 由于该更改,我不得不向base64.decode和base64.encode添加一个标志。解码效果良好: 但是当向base64.encode添加标志时,奇怪的事情发生了: 当我写“return base64.encode(”)时,Android Studio告诉我它需要一个byte[]输入和一个int标志。所以我想,我可
我想将一个字符串编码成并通过套接字传输它,然后解码回来。 下面是我的代码,结果是“77+9x6s=” 有什么想法如何实现这一点吗?
问题内容: 是否有仅使用JAVA 1.5 LIBRARIES来解码base64字符串的简便方法? 由于Windows和Mac OS X之间存在跨平台兼容性问题,我必须使用Java 1.5(仅Mac 10.5支持Java 1.6,低于10.5的所有内容均默认使用Java 1.5)。 对象“ sun.misc.Base64Decoder”在Java 6中存在,但在Java 5中不存在。 问题答案: 不
问题内容: 我试图比较两个由sha512编码的不同字符串。但是,结果不同。我的意思是这可能是编码问题。我希望你能帮助我。 这是我的Java代码: 并且,这是我的C#代码: 问题出在哪里 ?谢谢你们 更新 如果我不指定编码类型,那么我想它就是Unicode。结果是这样(不指定任何内容): 相反,如果我在Java中指定UTF-16: 总是不同的! 问题答案: 在C#中使用的in对应于 Little-e
我一直在尝试在我的应用程序中实现GMAIL API,该应用程序是使用Swift5和Xcode构建的。我已经成功地检索到来自用户的电子邮件,但我无法从编码字符串中获得实际的文本。每当我尝试将这个base64编码的数据转换为普通字符串时,它都返回NIL。 这是绳子 stackoverflow的一些答案建议向string添加填充,但这也不起作用。
问题内容: 我正在使用Javascript 函数解码base64编码的字符串(特别是来自GitHubAPI的base64编码的内容)。问题是我回来了ASCII编码的字符(而不是)。如何正确处理传入的以base64编码的流,以便将其解码为utf-8? 问题答案: 此问题: “ Unicode问题”由于s是16位编码的字符串,因此在大多数浏览器中,如果字符超出8位字节的范围(0x00〜0xFF),则调