私のAES暗号化/復号化機能が働いていないランダムivecs
質問
ったので退屈してしまったと書いたのラッパopenSSLいAES暗号化の少ない。だいこう:http://pastebin.com/V1eqz4jp (ivec=0)
全ての作品がデフォルトのivecはすべて0のは、一部のセキュリティです。今のデータを文字列としてとにかくきっかけになるかもしれないとなランダムに生成しivecに貼り付けフロントにて、かきた文字列を復号?何らかの理由で動作しないものです。
も合わせなければならないという、ほとんどです。そうで復の中の文字列ではなく、初 または終了:
String is: 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
Encrypting..
���l%%1u���B!
�����`pN)�ɶ���[l�ӏ��{�Q�?�2�/�HԵ�y"�=Z�Cu����l%%1u���B!
Decrypting..
String is: �%���G*�5J�0��0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
私は正直にうかが間違っている。もしかしたかの間違いやになったかもしれない何かが足りない約AES?
こちらのコード:(編集をSteve Jessopソリューションに私の最初の問題)
/*!
* Simple AES
* Brendan Long
* March 29, 2010
*
* Simplified encryption and decryption using OpenSSL's AES library.
* Remember to compile with -lcrypto and link against the library
* g++ (your stuff) -lcrypto simpleAes.cpp (or simpleAes.o)
*
* Implementation note: Using the default ivec (0) is not secure. For
* the full security that AES offers, use a different
* ivec each time (it does not need to be secret,
* just different.
*
* This code is released into the public domain. Yada yada..
* Read this for details: http://creativecommons.org/licenses/publicdomain/
*
* If for some reason public domain isn't good enough, you may use, alter,
* distribute or do anything else you want with this code with no restrictions.
*/
#include <openssl/aes.h>
#include <iostream>
#include <stdlib.h>
#include <time.h>
bool seed = true;
/*!
* Encrypts a string using AES with a 256 bit key
* Note: If the key is less than 32 bytes, it will be null padded.
* If the key is greater than 32 bytes, it will be truncated
* \param in The string to encrypt
* \param key The key to encrypt with
* \return The encrypted data
*/
std::string aes_encrypt(std::string in, std::string key){
// Seed the random number generator once
if(seed){
srand( (unsigned int) time(NULL));
seed = false;
}
// Generate a random ivec
unsigned char ivec[16];
for(int i=0; i<16; i++){
ivec[i] = (unsigned char) rand();
}
// Round up to AES_BLOCK_SIZE
size_t textLength = ((in.length() / AES_BLOCK_SIZE) + 1) * AES_BLOCK_SIZE;
// Always pad the key to 32 bits.. because we can
if(key.length() < 32){
key.append(32 - key.length(), '\0');
}
// Get some space ready for the output
unsigned char *output = new unsigned char[textLength];
// Generate a key
AES_KEY *aesKey = new AES_KEY;
AES_set_encrypt_key((unsigned char*)key.c_str(), 256, aesKey);
// Encrypt the data
AES_cbc_encrypt((unsigned char*)in.c_str(), output, in.length() + 1, aesKey, ivec, AES_ENCRYPT);
// Make the data into a string
std::string ret((char*) output, textLength);
// Add the ivec to the front
ret = std::string((char*)ivec, 16) + ret;
// Clean up
delete output;
delete aesKey;
return ret;
}
/*!
* Decrypts a string using AES with a 256 bit key
* Note: If the key is less than 32 bytes, it will be null padded.
* If the key is greater than 32 bytes, it will be truncated
* \param in The string to decrypt
* \param key The key to decrypt with
* \return The decrypted data
*/
std::string aes_decrypt(std::string in, std::string key){
// Get the ivec from the front
unsigned char ivec[16];
for(int i=0;i<16; i++){
ivec[i] = in[i];
}
in = in.substr(16);
// Always pad the key to 32 bits.. because we can
if(key.length() < 32){
key.append(32 - key.length(), '\0');
}
// Create some space for output
unsigned char *output = new unsigned char[in.length()];
// Generate a key
AES_KEY *aesKey = new AES_KEY;
AES_set_decrypt_key((unsigned char*)key.c_str(), 256, aesKey); // key length is in bits, so 32 * 8 = 256
// Decrypt the data
AES_cbc_encrypt((unsigned char*)in.c_str(), output, in.length(), aesKey, ivec, AES_DECRYPT);
// Make the output into a string
std::string ret((char*) output);
// Clean up
delete output;
delete aesKey;
return ret;
}
解決 3
友人を把握し、問題です。になっているこ
- をランダム番号を格納します
ivec
- 暗号化データ
ivec
- Append ivec初期にかけて出力データ
問題はステップ2の内容を変化させivec.私は基本的には収納ランダム番号の先頭の文字列になります。この溶液を追加します:
unsigned char ivec[16];
// set ivec to random numbers
std::string ivecString((char*) ivec, 16);
// encrypt data
return ivecString + encryptedData;
他のヒント
あなたは、暗号化する前に「出力」へIVEC [16]を保存する必要があります。 それはそれだ...
私も文字列の代わりに*それがcharと仕事にはるかに簡単になるだろうことを追加したいと思います。
この行は間違ってます:
std::string ret((char*) output);
復号化されたデータは、あなたがin.length()
バイトを暗号化するので、NULターミネータを持っていません。これは、初めにごみ終わりにごみを占め、ではなく。同様に他の問題がある可能性があります。
あなたが出力をエンコードするようなベース64などの追加のステップを実行しない限り、
は、一般的に、あなたは、文字列として暗号化段の出力を扱うことができません。任意の出力バイトがNUL可能性があります。
所属していません StackOverflow