【问题标题】:c++ simple Caesar cipher algorithmc++简单的凯撒密码算法
【发布时间】:2012-09-27 12:33:00
【问题描述】:

我正在尝试制作一个非常简单的凯撒密码算法来加密和解密游戏中的玩家数据,但我得到了一些奇怪的结果。算法的任务很简单,只需向前或向后推动ascii 表。

std::string Encrypt(std::string in,int key)
{
    const char* chars=in.data();
    char* newchar=(char*)malloc(sizeof(char)*in.length());
    for(int c=0;c<in.length();c++)
    {
        newchar[c]=char(((int)chars[c])+key);//I suspect somewhere here is the problem
    }

    std::string out(newchar);
    return out;
}

LOGI("encrypt:%s",Encrypt("hello",10).data());
LOGI("decrypt:%s",Encrypt(Encrypt("hello",10),-10).data());

输出:

encrypt:rovvyu@ 
decrypt:hellok

我对加密知之甚少,我对 ascii 和整个字符在 c 中的工作原理知之甚少

【问题讨论】:

  • 正在解密游戏的文本部分,如果不是,您为什么不使用已建立库中的现代加密技术?在当今时代,字母替换算法对任何保护都没有用处。哎呀,人们这样做是为了好玩in the newspaper
  • sizeof(char) == 1,顾名思义。
  • 你应该释放newcharout 将制作自己的字符串副本。
  • 如果你已经在使用std::string 为什么要malloc输出数组?
  • @Scott ,我不想使用任何外部库,因为我想让它保持简单,我并不真正关心用户找到真实数据,我只是想让它对他们来说很困难.

标签: c++ encryption char


【解决方案1】:
std::string Encrypt(const std::string & in, int key)
{
    std::string out(in);
    for(int i=0; i < in.length(); ++i)
    {
        out[i] += key;
    }
    return out;
}

【讨论】:

    【解决方案2】:

    问题在于将“键”添加到 a..z 中的值可能不会回到该范围内。像

    if (chars[c] >= 'a' && chars[c] <='z') newchar[c] = 'a' + ((chars[c]-'a'+key)%26);
    else if (chars[c] >= 'A' && chars[c] <='Z') newchar[c] = 'A' + ((chars[c]-'A'+key)%26);
    else newchar[c] = chars[c];
    

    希望您有充分的理由使用如此弱的东西。顺便说一句,使用 26 键反转。

    【讨论】:

      【解决方案3】:

      如果您只想知道如何制作凯撒密码,那很酷。如果您确实想保护某些数据,请不要这样做!与猪拉丁文相比,它不再是一种加密方法。

      改为使用预先编写的加密库。不要自己写,因为它需要很长时间才能正确完成。 AES 在大多数情况下都足够快且足够好,并且具有适用于几乎所有编程语言的库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多