Secret Chat Encryption
本章探讨在不安全的网络下(路由器抓包、运营商注入广告等中间人监听方式)如何对聊天内容进行加密,即在网络上传输的都是密文,只有知道密钥的双方才能解密出内容。
基础
对称加密和非对称加密
对称加密:AES算法 非对称加密:RSA算法
AES加密的代码示例:
int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
                        AES_KEY *key);
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
                        AES_KEY *key);
void AES_encrypt(const unsigned char *in, unsigned char *out,const AES_KEY *key);
void AES_decrypt(const unsigned char *in, unsigned char *out,const AES_KEY *key);
// 设置密钥 AES key
std::string aesKey="12345678901234567890123456789012";
AES_set_encrypt_key((const unsigned char *) strKey.c_str(), 256, &m_cEncKey);
int CAes::Encrypt(const char *pInData, uint32_t nInLen, char **ppOutData, uint32_t &nOutLen) {
    if (pInData == NULL || nInLen <= 0) {
        return -1;
    }
    uint32_t nRemain = nInLen % 16;
    uint32_t nBlocks = (nInLen + 15) / 16;
    if (nRemain > 12 || nRemain == 0) {
        nBlocks += 1;
    }
    uint32_t nEncryptLen = nBlocks * 16;
    unsigned char *pData = (unsigned char *) calloc(nEncryptLen, 1);
    memcpy(pData, pInData, nInLen);
    unsigned char *pEncData = (unsigned char *) malloc(nEncryptLen);
    CByteStream::WriteUint32((pData + nEncryptLen - 4), nInLen);
    for (uint32_t i = 0; i < nBlocks; i++) {
        AES_encrypt(pData + i * 16, pEncData + i * 16, &m_cEncKey);
    }
    free(pData);
    string strEnc((char *) pEncData, nEncryptLen);
    free(pEncData);
    string strDec = base64_encode(strEnc);
    nOutLen = (uint32_t) strDec.length();
    char *pTmp = (char *) malloc(nOutLen + 1);
    memcpy(pTmp, strDec.c_str(), nOutLen);
    pTmp[nOutLen] = 0;
    *ppOutData = pTmp;
    return 0;
}
主流加密方式:微信和Telegram是如何对内容进行加密的?
思考:
进阶:Telegram 的 P2P 加密
Diffie-Hellman key exchange
to do…
see: