当前位置: 首页 > news >正文

接上一主题,直接对二进制进行加密,密钥不写入电脑。

       主题思想是数据的每一个Byte值都跟密钥相关联,当密钥的长度等于1时,每个_byte都加上密

钥的值,这有几十种可能,很容易破解,这就是电脑密码长度不能太少的原因。下面上代码,时间

有点仓促,欢迎指正:

/// <summary>
/// 加密二进制数据
/// </summary>
/// <param name="pData"></param>
/// <param name="nLength"></param>
/// <param name="sKey"></param>
/// <returns></returns>
/// 创建时间: 2015-03-23     最后一修改时间:2015-03-23
_ByteArray _MyApp::toEncrypt(const _byte* pData, const size_t nLength, const char* sKey)
{
    assert(sKey != null);
  
    //加密时:     每个byte值 + skey[byte索引 % sKey的长度] 的字符值
    //解码时:     每个byte值 - skey[byte索引 % sKey的长度] 的字符值        
     

    //校验码
    _uint64 dataSumValue = 0; //数据权重值,为校验作准备
    _uint16 nKeySumValue = 0;

    const char* pKey = sKey;
    _byte nKeyLength = 0;

    while (*pKey != 0) {
        nKeySumValue += *pKey;
        ++pKey;
        ++nKeyLength;
    }
  

    _ByteArray result(nLength + 20);

    result.add_t(nKeySumValue);      //sKey的权重值     2
    
    for (size_t n = 0; n < nLength; ++n) {
        dataSumValue += pData[n];
        _byte index = n % nKeyLength;
        result.add( pData[n] + sKey[index]);
        //result.add(pData[n]);
    }

    result.add_t(nLength);            //写入数据长度      8
    result.add_t(dataSumValue);       //写入数据权重值    8 
     
    return result;
}


/// <summary>
/// 解密二进制数据,不成功返回空的_ByteArray
/// </summary>
/// <param name="pData"></param>
/// <param name="nLength"></param>
/// <param name="sKey"></param>
/// <returns></returns>
/// 创建时间: 2015-03-23     最后一修改时间:2015-03-23
_ByteArray _MyApp::toDecrypt(const _byte* pData, const size_t nLength, const char* sKey)
{
    assert(sKey != null);
    
    _ByteArray result(nLength);

    if (nLength < 18) {
        std::cout << "错误:数据长度不对!" << "\n";
        result.ZeroBufferOne();
        return result;
    }
     

    //校验码
    _uint64 dataSumValue = *((_uint64*)(pData + nLength - 8)); //数据权重值,为校验作准备
    _uint16 nKeySumValue = *((_uint16*)(pData));
    _uint64 nDataLength = *((_uint64*)(pData + nLength - 16));
     
    _uint16 nKeySumValue2 = 0;

    const char* pKey = sKey;
    _byte nKeyLength = 0;

    while (*pKey != 0) {
        nKeySumValue2 += *pKey;
        ++pKey;
        ++nKeyLength;
    }

    if (nKeySumValue2 != nKeySumValue) {
        std::cout << "错误:密钥不对!" << "\n";
        result.clearData();
        result.ZeroBufferOne();
        return result;
    }

    _uint64 dataSumValue2 = 0;

    const _byte* pData2 = pData + 2;
     

    for (size_t n = 0; n < nDataLength; ++n) {      
        _byte index = n % nKeyLength;        
        _byte b = pData2[n] - sKey[index];
        result.add(b);
        dataSumValue2 += b;  
    }

    if (dataSumValue2 != dataSumValue) {
        std::cout << "错误:数据校验失败!" << "\n";
        result.clearData();
        result.ZeroBufferOne();
        return result;
    }
    
    return result;
}
 

例子1:

例子2:

例子3

在密钥根本没有写入计算机,看看分析源代码来破解:

只有一个函数,还可以设计再好一点,加一个随机字符串中,

在随机字符中获得值,但思想都差不多。

相关文章:

  • .NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar
  • AI比人脑更强,因为被植入思维模型【17】万物联系思维模型
  • 低功耗蓝牙(BLE)方案设计实战指南
  • 程序代码篇---SQLite数据库存储信息
  • 操作系统的特征
  • 程序设计语言的分类和特点
  • 学习本地部署DeepSeek的过程(基于ollama)
  • 产品经理如何管理需求池
  • Spring AOP 核心概念与实践指南
  • 图解模糊推理过程(超详细步骤)
  • DeepSeek、Grok 与 ChatGPT 4.5:新一代大模型架构与推理能力深度解析
  • 计算机网络——数据链路层的功能
  • [快乐学坊_2] 后端api测试
  • 如何修改进程的优先级
  • 重温Ubuntu 24.04 LTS
  • STM32基础篇(五)------TIM定时器比较输出
  • sgpt 终端使用指南
  • 轻松认识 SQL 关键字,打开数据库操作大门
  • JavaWeb基础-HTTP协议、请求协议、响应协议
  • 【凸优化】分式规划
  • 上海天文馆走进徐家汇书院,XR沉浸式天文科普体验再推力作
  • 赡养纠纷个案推动类案监督,检察机关保障特殊群体胜诉权
  • 美联储主席:供应冲击或更频繁,将重新评估货币政策方法中的通胀和就业因素
  • 视频丨中国海警成功救助8名外籍遇险渔民,韩方向中方致谢
  • 证券时报:中美互降关税落地,订单集中补发港口将迎高峰期
  • 知名猎头公司创始人兼首席执行官庄华因突发疾病逝世,享年62岁