zoukankan      html  css  js  c++  java
  • C++的AES加解密

      最近公司项目要做个WPF程序,但是底层加密部分要用C++来实现。通过网上搜索各种资料,地址已经记不下了,没发贴出来了! 下面看看如何加解密的~!先贴代码。。。。

     1  string tKey(sKey);
     2  string tIV(sIV);
     3  string outStr;
     4  string pt = StringToUTF8(plainText);
     5  SecByteBlock key((const byte*)tKey.data(), tKey.size());
     6  SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? 16 : tIV.size());
     7  AES::Encryption aesEncryption((byte *)key, tIV == "" ? AES::MAX_KEYLENGTH : AES::DEFAULT_KEYLENGTH);
     8  CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
     9  StringSource(pt, true,
    10   new StreamTransformationFilter(cbcEncryption,
    11    isHex ? dynamic_cast<BufferedTransformation*>(new HexEncoder(new StringSink(outStr))) :
    12    dynamic_cast<BufferedTransformation*>(new Base64Encoder(new StringSink(outStr))),
    13    StreamTransformationFilter::PKCS_PADDING));
    14  strcpy_s(outText, outStr.size() + 1, outStr.c_str());

      加密的AES使用的cbc pkcs7,128-256位的加密方式。这里牵扯到不需要偏移量的时候,所以使用SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? 16 : tIV.size());来给个默认的值,因为最小的需要16个字节,所以给值16。HexEncoder是加密的值是否为十六进制字符串,Base64Encoder是加密是否为Base64的字符串。strcpy_s是复制字符串到返回的char*中,因为要给C#回传,所以这里要用到,C#那边必须使用StringBuilder来接收,用string是拿不到值得。还有一个StringToUTF8是因为string的默认编码方式为gb2312,所以如果要加密的字符串是utf-8的编码方式需要转换一下。

     1  string tKey(sKey);
     2  string tIV(sIV);
     3  string outStr;
     4  SecByteBlock key((const byte*)tKey.data(), tKey.size());
     5  SecByteBlock iv(tIV == "" ? (const byte*)0x00 : (const byte*)tIV.data(), tIV == "" ? 16 : tIV.size());
     6  AES::Decryption aesDecryption((byte *)key, tIV == "" ? AES::MAX_KEYLENGTH : AES::DEFAULT_KEYLENGTH);
     7  CBC_Mode_ExternalCipher::Decryption cbcDecryption(aesDecryption, iv);
     8  BufferedTransformation *decryptor = isHex ?
     9   dynamic_cast<BufferedTransformation*>(new HexDecoder(new StreamTransformationFilter(cbcDecryption, new StringSink(outStr)))) :
    10   dynamic_cast<BufferedTransformation*>(new Base64Decoder(new StreamTransformationFilter(cbcDecryption, new StringSink(outStr))));
    11  decryptor->Put((byte *)cipherText, strlen(cipherText));
    12  decryptor->MessageEnd();
    13  outStr = UTF8ToString(outStr);
    14  strcpy_s(outText, outStr.size() + 1, outStr.c_str());

    同理,解密的话与加密大致相同。UTF8ToString为utf-8转为gb2312编码格式。

    以上就是C++ cbc的加解密的方式。这里使用了一个第三方开源库Crypto++。

    文档地址

    开源地址

  • 相关阅读:
    【vim】 match手动设置想高亮的关键字
    【git】add代码之前查看大致修改代码量
    语法错误和语义错误区别
    PIL安装方法
    dlib的安装
    python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
    shape与reshape区别
    操作系统复习灭火思维导图
    sql语句模糊查询
    python中sort和sorted函数的区别
  • 原文地址:https://www.cnblogs.com/jx0906/p/8522806.html
Copyright © 2011-2022 走看看