仅使用公钥加密字符串

时间:2011-06-30 07:09:26

标签: java android cryptography aes

我正在开发一个Android项目,我需要使用128位AES加密字符串,填充PKCS7和CBC。我不想为此使用任何盐。

我尝试了很多不同的变体,包括PBEKey,但我无法想出工作代码。这就是我目前所拥有的:

String plainText = "24124124123";
String pwd = "BobsPublicPassword";
byte[] key = pwd.getBytes(); 
key = cutArray(key, 16);
byte[] input = plainText.getBytes();
byte[] output = null;
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
output = cipher.doFinal(input);

private static byte[] cutArray(byte[] arr, int length){
byte[] resultArr = new byte[length];
for(int i = 0; i < length; i++ ){
    resultArr[i] = arr[i];
}
return resultArr;
}

任何帮助表示赞赏

4 个答案:

答案 0 :(得分:0)

[B @ 44f075b0看起来像一个对象引用。你在这里返回一个数组,确定你没有打印出数组的内存地址而不是它的内容?

答案 1 :(得分:0)

尝试使用System.out.println("..encrypted data is.."+new String(output));

打印加密数据

它会显示加密的字符串

答案 2 :(得分:0)

考虑散列密码短语:

        // hash pass one
        byte[] inDigest;
        MessageDigest digester= MessageDigest.getInstance("SHA-256"); // returns 256bits/ 32 bytes
        byte[] message= password.getBytes("UTF8");  
        digester.update(message); // append message
        inDigest= digester.digest(); // no salt
        byte[] outDigest= new byte[lengthKey];
        for (int i=0; i<lengthKey; i++){ // truncate bytes
            outDigest[i]= inDigest[i];
        }
        return outDigest;

在真实世界的代码中,请考虑多次散列密码短语。

答案 3 :(得分:0)

据我所知,您对密码学的理解存在缺陷。

你正在以16块为单位削减'KEY'。没有必要。但是,如果你削减了任何东西,你必须将明文切换为16字节的AES-128块。

您的代码可能适用于给定的纯文本。但是,一旦增加明文的大小,它就会失败。

关于[@B ..部分,一旦加密,数据默认为byte []。这就是你得到它的原因。使用

将消息转换为十六进制格式

http://forums.xkcd.com/viewtopic.php?f=11&t=16666

这将使加密的消息保持人类可读的形式,可以在模拟器上显示。

要解密,首先从十六进制转换为字节数组,然后解密。

您可以使用以下链接

1- http://www.androidsnippets.com/encryptdecrypt-strings

2- http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html