#ifndef __DAKUANG_BASE64_H__
#define __DAKUANG_BASE64_H__

#include <string>

namespace LenheartBase
{
    class CBASE64
    {
    public:
        // 生成RSA密钥结构
        static void* __genKey(int nBits);

        // 生成密钥对，输出为PEM字符串
        static bool genKeyStrings(std::string& strPrivateKeyPEMString, std::string& strPublicKeyPEMString);

        // 执行BASE64编码操作
        static std::string encode(const std::string& str);

        // 执行BASE64解码操作
        static std::string decode(const std::string& str);

        // 执行RSA私匙解密操作
        static std::string RsaPriDecrypt(const std::string& cipher_text, const std::string& pri_key);
        // 执行RSA私匙加密操作
        static std::string RsaPriEncrypt(const std::string& clear_text, const std::string& pri_key);

        // 使用PEM私钥字符串加密
        static bool encryptByPrivatePEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString);

        // 使用PEM公钥字符串加密
        static bool encryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString);

        // 使用PEM公钥字符串解密
        static bool decryptByPublicPEMString(const std::string& strIn, std::string& strOut, const std::string& strKeyPEMString);

        // 使用RSA执行加密或解密
        static bool __encryptOrDecrypt(const std::string& strIn, std::string& strOut, const void* pRSA, const void* pFunc, bool bEncrypt);

    private:
        // 分组编码
        static int __encode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen);

        // 分组解码
        static int __decode(unsigned char* pDest, const unsigned char* pSrc, size_t nSrcLen);

    private:
        // 编解码转换表
        static unsigned char s_encTable[];
        static unsigned char s_decTable[];
    };
}

#endif