Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓和加密&x2B+;AES 128位加密结果不匹配_Android_C++_Encryption_Crypto++_Javax.crypto - Fatal编程技术网

Android 安卓和加密&x2B+;AES 128位加密结果不匹配

Android 安卓和加密&x2B+;AES 128位加密结果不匹配,android,c++,encryption,crypto++,javax.crypto,Android,C++,Encryption,Crypto++,Javax.crypto,我试图使用相同的密钥和VI来加密和解密相同的消息,比如说aabbcc@gmail.com。密钥长度是128位,我知道在Java/Android中,256不容易实现 下面是我使用加密进行AES加密的函数++ string encryptString(string toBeEncrypted) { // // Create Cipher Text // CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLEN

我试图使用相同的密钥和VI来加密和解密相同的消息,比如说
aabbcc@gmail.com
。密钥长度是128位,我知道在Java/Android中,256不容易实现

下面是我使用加密进行AES加密的函数++

string encryptString(string toBeEncrypted) {
//
// Create Cipher Text
//
CryptoPP::AES::Encryption aesEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);

std::string ciphertext;

std::cout << "To be encrypted (" << toBeEncrypted.size() << " bytes)" << std::endl;
std::cout << toBeEncrypted;
std::cout << std::endl << std::endl;

CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink(ciphertext), CryptoPP::StreamTransformationFilter::PKCS_PADDING);
stfEncryptor.Put(reinterpret_cast<const unsigned char*> (toBeEncrypted.c_str()), toBeEncrypted.length() + 1);
stfEncryptor.MessageEnd();

}
我检查了十六进制字符串与字节数组
key
iv
的内存,它们是匹配的

加密的结果
aabbcc@gmail.com<代码> >代码> C08A50B56F166502E290E05390A6C6FE533 E11E9F802AD7D781FD41F964 < /代码>从C++。

我通过将返回的字符串
ciphertext
传递到函数
hexToStr
like
cout来实现这一点,Crypto++消息中的电子邮件是
'0'
终止的,但Java中的消息不是

由于AES是一种块长度为128位(16字节)的分组密码,而您的电子邮件正好有16字节长,因此在两种实现中,第一个块的加密方式相同。第二个块第一个位置的
'0'
给出了第二个加密块的差异

请注意下面使用的屏幕截图中额外的
'00'
'00'
后面的所有
'0f'
都是该工具未在此处删除的PKCS5填充


您使用的是哪个版本的Crypto++?Crypto++提供了一个。你可以用它代替
std::string hexToStr(…)
如果你喜欢的话。apt-cache showpkg libcrypto++9v5包:libcrypto++9v5版本:5.6.1-9(/var/lib/apt/lists/archive.ubuntu.com_ubuntu\u dists\u xenial\u universe\u binary-amd64\u包)(/var/lib/dpkg/status)我在Java8的Netbeans中使用了相同的代码,运行在同一个Ubuntu的C++代码中,得到的结果与Android上运行的结果完全一样。我不认为这是OS依赖的,但是我在代码中可能使用java或C++做了错误的事情。顺便说一下,它是<代码> HexEncoder <代码>,它与我自己的代码< HeXtoSTR < /代码>相比,返回的十六进制字符串完全相同。我认为这个TEST没有加密…谢谢
std::string hexToStr(unsigned char *data, int len)
{
    std::stringstream ss;
    ss<<std::hex;
    for(int i(0);i<len;++i){
        ss<<std::setfill('0')<<std::setw(2)<<(int)data[i];
    }

return ss.str();
}
string TFFEncryption::decryptString(string toBeDecrypted) {

string decryptedtext;
CryptoPP::AES::Decryption aesDecryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);

CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink(decryptedtext), CryptoPP::StreamTransformationFilter::PKCS_PADDING);
stfDecryptor.Put(reinterpret_cast<const unsigned char*> (toBeDecrypted.c_str()), toBeDecrypted.size());
stfDecryptor.MessageEnd();

return decryptedtext;
}
public class myAES {
private static final String key = "4ff539a893fed04840749287bb3e4152";
private static final String initVector = "79f564e83be16711759ac7c730072bd0";
private final  static char[] hexArray = "0123456789ABCDEF".toCharArray();

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}

public static byte[] encrypt(String value) {
    try {
        IvParameterSpec iv = new IvParameterSpec(hexStringToByteArray(initVector));
        SecretKeySpec skeySpec = new SecretKeySpec(hexStringToByteArray(key), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);

        byte[] encrypted = cipher.doFinal(value.getBytes());
        Log.v("Encryption successful", bytesToHex(encrypted));
        return encrypted;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

public static String decrypt(byte[] encrypted) {
    try {
        IvParameterSpec iv = new IvParameterSpec(hexStringToByteArray(initVector));
        SecretKeySpec skeySpec = new SecretKeySpec(hexStringToByteArray(key), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);

        byte[] original = cipher.doFinal(encrypted);
        Log.v("Decryption successful", new String(original, "UTF-8"));
        return new String(original);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}
}