开发者

c++ mcrypt error at mcrypt_generic

I have the following code:

[test.cpp]

#include <mcrypt.h>
#include <string>
#include <iostream>
#include <vector>
#include <stdio.h>
#include <stdlib.h>

#include <string>
using namespace std;
int main()
{
  char algo[] = "rijndael-256";
  char mode[] = "cbc";
   char *block_buffer=(char*)"HELLO!! MY NAME IS: ";
cout<<"here"<<endl;
string s;
char key="1234-5678-9654-7512-7895-2543-12";


  char iv[]  = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};;

  MCRYPT td = mcrypt_module_open(algo, NULL, mode, NULL);
  if (td == MCRYPT_FAILED) { cout<<"error"<<endl;}

int keysize=32;
  int r =  mcrypt_generic_init(td, key, keysize, iv);
if (r<0)
{
    cout<<"error2"<<endl;
    mcrypt_perror(r);
            return 1;

}

 //while ( fread (&block_buffer, 1, 1, stdin) == 1 ) {
   int j=          mcrypt_generic (td, &block_buffer, sizeof(block_buffer));
if (j!=0){std::cout<<"error encrypting"<<std::endl;} // I HAVE ERROR HERE J==0


 //how to print the encrypted string??

 cout<<"buffer "<<block_buffer<<endl; //this is not the encriperd string. why?

    mcrypt_generic_deinit(td);

  mcrypt_module_close(td);
}

I am testing the code:

$: g++ test.cpp -o 开发者_如何学JAVAtst -lmcrypt  
                      $: ./tst

WHERE SHOULT I ADD THE PKCS 7?

I have the following method:

std::string add_pkcs7_padding(std::string s, std::size_t n)
{
  const std::size_t fill = n - (s.length() % n);
  s.append(fill, static_cast<char>(fill));
  return s;
}

std::string strip_pkcs7_padding(std::string s, std::size_t n)
{
  const std::size_t pad = static_cast<unsigned char>(*s.rbegin());
  return s.substr(0, s.length() - pad);
}

I din't know when should i run it and where in my code.

NEED SOME HELP. APPRECIATE A LOT!!

EDIT:

I have error at: mcrypt_generic (td, &block_buffer, sizeof(block_buffer)); The compiler prints that the value j=0;


You should invoke mcrypt_generic() with a char*, not a char** as you do:

mcrypt_generic(td, block_buffer, sizeof(block_buffer));
                   ^^^           ^^^^^^^^^^^^^^^^^^^^
                                      ouch!

Also, the length is wrong, as sizeof(block_buffer) is just be the size of the pointer, not the string; if anything you need strlen(block_buffer).

But this is still going to be wrong in general because you need your message to be a multiple of the block size. Use the padding function:

std::string s = add_pkcs7_padding(block_buffer, mcrypt_enc_get_block_size(td));
std::vector<char> v(s.begin(), s.end());  // this will hold the encrypted data
mcrypt_generic(td, v.data(), v.size());

By the way, your plaintext should be declared like this:

const char * block_buffer = "HELLO!! MY NAME IS: ";
^^^^^                       ^^^^
  constness!                  no explicit cast!

But why so clumsy, it's better to just use a string:

std::string plaintext = "HELLO!! MY NAME IS: ";


I think you might benefit from picking up a good C++ book and familiarizing yourself with the basics of the language a bit - it's good to have a project to work on, but most of your problems aren't really related to encryption or mcrypt, but just general C++ programming.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜