c-未签名字符的字符串

这是一个有趣的.我正在编写AES加密算法,并设法使它进行准确的加密.当我尝试将结果写入文件时,麻烦就来了.我正在获取输出错误的文件.十六进制值将被破坏,并且通常只是荒谬的(即使是按加密标准).

在将加密输出发送到文件之前,我通过采样加密输出进行了一些调试.我发现我在某处出现某种类型的溢出.当正确的十六进制值为9e时,我将得到ffffff9e.只会对7F以上的十六进制值执行此操作,即“扩展”字符集中的字符未正确处理.这在我的项目中也曾发生过,当时的问题是使用char [] []容器而不是未签名的char [] []容器.

我的代码使用字符串在用户界面和AES加密类之间传递加密的数据.我猜std :: strings不支持扩展字符集.所以我的问题是:是否可以实例化未签名的字符串,还是我必须找到一种方法来替换所有使用的字符串?

解决方法:

std :: string实际上只是一个typedef,类似于:

namespace std { 
   typedef basic_string<char> string;
}

为无符号字符创建变体非常容易:

typedef basic_string<unsigned char> ustring;

但是,您将必须更改代码以使用ustring(或您喜欢的任何名称)代替std :: string.

根据您编写代码的方式,虽然可能不需要编辑所有代码.特别是,如果您有以下内容:

namespace crypto { 
   using std::string;

   class AES { 
      string data;
      // ..
    };
}

您可以通过仅更改using声明来更改字符串类型:

namespace unsigned_types { 
    typedef std::basic_string<unsigned char> string;
}

// ...

namespace crypto {
    using unsigned_types::string;

    class AES {
        string data;
    };
}

还要注意,即使模板的实例化类型相关,模板的不同实例化也完全是单独的类型,因此,您可以在char和unsigned char之间进行隐式转换的事实并不意味着您将获得匹配的隐式basic_string< char>之间的转换和basic_string< unsigned char>.

上一篇:用C加密/取消加密Python脚本


下一篇:php – 加密用户数据以自动登录到第三方系统