国密SMS4白盒 C/C++ SDK 文档

国密SMS4白盒密码算法,即将SMS4密钥隐藏在查找表中,加解密的过程就变成查表过程。查找表分加密查找表及解密查找表,用加密查找表加密的结果,只能用解密查找表解密。

注: 白盒加密或解密前,需要使用查找表初始化白盒加密,即需要事先调用wbsms4Setup

接口描述:

/**
 * 白盒密码初始化,用存放了白盒密码查找表的文件初始化白盒密码。
 * 因为查找表被置乱了,所以需要转入用于置乱查找表的SBOX。
 * 即可用加密查找表初始化,也可用解密查找表初始化。
 * @param filePath 查找表文件的路径
 * @param sbox 用于置乱白盒密码查找表的SBOX
 * @throws YiCryptException 计算出错时抛出异常。
 */
void wbsms4Setup(const char * filePath, const unsigned char * sbox) throw (YiCryptException);

/**
 * 白盒密码加密,加密的结果只能用拥有解密查找表的白盒进行解密
 * @param padding_mode 填充模式,支持NO_PAD及PAD_PKCS_7
 * @param in 输入数据
 * @return 计算结果
 * @throws YiCryptException 计算出错时抛出异常。
 */
std::string wbsms4Encrypt(YiPaddingMode padding_mode, const std::string & in) throw (YiCryptException);

/**
 * 白盒密码解密,只能用于解拥有加密查找表的白盒加密结果
 * @param padding_mode 填充模式,支持NO_PAD及PAD_PKCS_7
 * @param in 输入数据
 * @return 计算结果
 * @throws YiCryptException 计算出错时抛出异常。
 */
std::string wbsms4Decrypt(YiPaddingMode padding_mode, const std::string & in) throw (YiCryptException);
接口异常:

ERR_WBSMS4_ILLEGAL_PARAMS: 白盒密码参数非法
ERR_ILLEGAL_INPUT: 输入非法
ERR_WBSMS4_ENCRYPT_FAILED: 白盒加密失败
ERR_WBSMS4_DECRYPT_FAILED: 白盒解密失败
调用示例:

string sbox = YiSMCore::getInstance().str2Bcd(
     "3FCA020F2CD08F1E13016B8AAFC103BDBC8C0AD3D89000ABB3B80645E4F7"
      "0558EDFDDAB9706C50488DA7849D155E574668861698F87264F6655D92B6A"
      "4D4CC5CD928B2242E0866A18B6D25D15B7649A2C2A63D237B543294FA424E"
      "C34CEE0B952F9B87FFE37C8239DEC4CBE98E344443363038A50952D56AF38"
      "1FBD740BF9EA377BA26D62B177E0421557D0C69E163142AAEB0F5E0A04D3B"
      "53836199EBC83CBBB5190D4A5160A97FC993EF9CE52D9F7A078831C7DD1F3"
      "3A880275FEC12B15910D2C6207956FC4B3ECD78F45ADB9AFEC0291D89C5F1"
      "47711A18AA1BBEB76F0E62ADE78535AC962274751C6EDFF9E2E837674FEAD"
      "C913A4111B4F073E6F297CECF");

// TODO change the table file's path
YiSMCore::getInstance().wbsms4Setup("encrypt.tb", (const unsigned char *)sbox.c_str());

// NO_PAD 加密
string wbNoPaddingEnc = YiSMCore::getInstance().wbsms4Encrypt(NO_PAD,
     YiSMCore::getInstance().str2Bcd("0123456789abcdeffedcba9876543210"));

// NO_PAD 解密
string wbNoPaddingDec = YiSMCore::getInstance().wbsms4Decrypt(NO_PAD,
     YiSMCore::getInstance().str2Bcd("9B113BE58CDD28C6F945D72D2A412CA7"));

// PAD_PKCS_7 加密
string wbPKCS7PaddingEnc = YiSMCore::getInstance().wbsms4Encrypt(PAD_PKCS_7,
     YiSMCore::getInstance().str2Bcd("616263"));

// PAD_PKCS_7 解密
string wbPKCS7PaddingDec = YiSMCore::getInstance().wbsms4Decrypt(PAD_PKCS_7,
     YiSMCore::getInstance().str2Bcd("D9A477577719D8311E779105051C0943"));
输出示例:

wbNoPaddingEnc: 79CDA104497A82D58E6BF09267FCC60B

wbNoPaddingDec: 0123456789ABCDEFFEDCBA9876543210

wbPKCS7PaddingEnc: FA17CCF37795597A75A95A49915B8296

wbPKCS7PaddingDec: 616263