2017-12-11 17 views
0

私はこれまでしばらく苦労してきました。私は私のプログラムを実行すると、時々私は、これらのエラーを参照してください。OpenSSL RSA関数を使用してC++でエラーを解読する

bad decrypt 
140380701197976:error:0606506D:digital envelope 
routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:518: 

は時々、私はこれらのエラーを参照してください。

RSA operation error 
139986632922776:error:0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:rsa_pk1.c:273: 
139986632922776:error:04065072:rsa 
routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:rsa_eay.c:602: 
Error reading password from BIO 
Error getting password 

そして、時には、私はまったくエラーが表示されません!私はGalliumOSで動作しています.GalliumOSは、Chromeハードウェア用に作られたUbuntuの味です。

私には何が欠けていますか?私は一生懸命に見てきました。そして、私は非常に重要なものを見つけることができません。参考までに、以下に私のコードを添付しました。私は最後の2つのコマンドの1つにエラーを絞り込んだと思うが、私は肯定的ではない。

#include <cstdlib> 
#include <string> 
using namespace std; 

int main() 
{ 
    string bob_keys, alice_plaintext, alice_encrypted, bob_decrypted; 

    // ----- USER INPUT ----- 
    // TODO: switch to user input 
    bob_keys = "bob_keys.pem"; 
    bob_decrypted = "bob_decrypted.txt"; 
    alice_encrypted = "alice_encrypted.txt"; 
    alice_plaintext = "alice_plaintext.txt"; 

    // ----- CONFIDENTIALITY: MESSAGE ENCRYPTION ----- 
    // generate session key 
    system("openssl rand -base64 64 -out key.bin"); 

    // encrypt message using session key 
    system(("openssl enc -aes-128-cbc -salt -in " + alice_plaintext 
     + " -out alice_plaintext.txt.enc -pass file:./key.bin").c_str()); 

    // encrypt session key using Bob's public key 
    system(("openssl rsautl -encrypt -inkey " + bob_keys 
     + " -pubin -in key.bin -out key.bin.enc").c_str()); 

    // write encrypted message and encrypted session key to file 
    system(("cat alice_plaintext.txt.enc > " + alice_encrypted).c_str()); 
    system(("echo >> " + alice_encrypted).c_str()); 
    system(("cat key.bin.enc >> " + alice_encrypted).c_str()); 

    // ----- CONFIDENTIALITY: MESSAGE DECRYPTION ----- 
    // get encrypted message and encrypted session key from file (and remove newlines) 
    system(("head -1 " + alice_encrypted + " > message.bin.enc").c_str());  
    system("tr -d '\n' <message.bin.enc> temp.bin && mv temp.bin message.bin.enc"); 
    system(("tail -1 " + alice_encrypted + " > key.bin.enc").c_str());  

    // decrypt the key using Bob's private key 
    system(("openssl rsautl -decrypt -inkey " + bob_keys 
     + " -in key.bin.enc -out key.bin").c_str()); 

    // decrypt the message using the decrypted key 
    system(("openssl enc -d -aes-128-cbc -in message.bin.enc -out " 
     + bob_decrypted + " -pass file:./key.bin").c_str()); 

    return 0; 
} 
+0

あなたのコードは 'system'を呼び出すだけです。単に代わりにシェルスクリプトを使用するのはなぜですか? – dbush

+0

ええ、それは私が思ったことです...なぜなら、私たちのインストラクターは私たちにC++ファイルを提出したいと思っています。私もそれに同意しないが、それは動作します。 – hockeysaint

答えて

0

バイナリファイルでは「ヘッド」と「テイル」を使用しています。その前に、バイナリをテキストとして解釈できる多くのトラップから脱出することができましたが、ここでは最終的に失敗します。あなたの暗号文に改行文字が含まれている可能性は十分あります。見つかった場合は、あなたの暗号文は間違っています。バイナリだけを使用するか、暗号文を基にして64の暗号化を行う必要があります。

C/C++の使い方を邪魔するのは素晴らしいことですが、最後の笑いはあなたにあります。あなたはキーの代わりにパスワードを使用しており、その結果はAESキーを使用するだけの結果と同じではありません。スマートで、代わりにCライブラリを使用してください。または、C++をもっと好きな人は、Crypto ++またはBothanを使用します。そして、実際にあなたの道をハッキングするのではなく、実際にプログラムする方法を学びましょう。あなたが最終的にあなた自身のハッキングから最大限苦しんでいる人になるからです。

関連する問題