当前位置: 首页 > 面试题库 >

Java:使用java.util.Base64和android.util.Base64解码base64字符串时,结果不同

廖华翰
2023-03-14
问题内容

我正在使用客户端/服务器系统,并且正在尝试进行一些基本的加密。当我连接到服务器时,我将公钥作为转义的字符串通过套接字发送。我已经验证了字符串在两端,换行符和所有字符串上都是
相同的

在客户端(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),则调