GMSm2Utils.h 5.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. //
  2. // Sm2Utils.h
  3. // TestPro
  4. //
  5. // Created by lifei on 2019/7/9.
  6. // Copyright © 2019 PacteraLF. All rights reserved.
  7. /**
  8. * SM2 加解密及签名的 OC 封装
  9. * Hex 编码格式代表 16 进制编码格式
  10. */
  11. #import <Foundation/Foundation.h>
  12. NS_ASSUME_NONNULL_BEGIN
  13. @interface GMSm2Utils : NSObject
  14. ///MARK: - 创建秘钥对
  15. /// 创建 SM2 公私钥(基于官方文档 NID_sm2 推荐曲线)。返回值:数组元素 1 为公钥,2 为私钥
  16. + (NSArray<NSString *> *)createKeyPair;
  17. ///MARK: - SM2 加密
  18. /// SM2 加密。返回值:加密后的字符串或 NSData(密文都为 ASN1 编码格式,可解码为 C1C3C2 格式),失败返回 nil
  19. /// @param plaintext 明文(普通字符串格式);plainHex 明文( Hex 编码格式);plainData 明文(NSData 格式)
  20. /// @param publicKey 04 开头的公钥( Hex 编码格式)
  21. + (nullable NSString *)encryptText:(NSString *)plaintext publicKey:(NSString *)publicKey;
  22. + (nullable NSString *)encryptHex:(NSString *)plainHex publicKey:(NSString *)publicKey;
  23. + (nullable NSData *)encryptData:(NSData *)plainData publicKey:(NSString *)publicKey;
  24. ///MARK: - SM2 解密
  25. /// SM2 解密。返回值:decryptToText 返回普通明文;decryptToHex 返回 Hex 格式明文;decryptToData 返回 NSData 格式明文,解密失败返回 nil
  26. /// @param ciphertext 密文(ASN1 编码格式);cipherData 密文(NSData 格式)
  27. /// @param privateKey 私钥( Hex 编码格式)
  28. + (nullable NSString *)decryptToText:(NSString *)ciphertext privateKey:(NSString *)privateKey;
  29. + (nullable NSString *)decryptToHex:(NSString *)ciphertext privateKey:(NSString *)privateKey;
  30. + (nullable NSData *)decryptToData:(NSData *)cipherData privateKey:(NSString *)privateKey;
  31. ///MARK: - ASN1 编码解码
  32. /// ASN1 编码。对 c1c3c2 格式密文进行 ASN1 编码,返回值:ASN1 编码后的密文。
  33. /// 参数:c1c3c2Hex 密文(字符串拼接 c1c3c2);c1c3c2Array 密文数组(@[c1,c3,c2]);c1c3c2Data 密文 Data(NSData 类型拼接的 c1c3c2)
  34. /// @param c1c3c2Hex 原始密文(c1c3c2 直接拼接的密文字符串, Hex 格式)
  35. + (nullable NSString *)asn1EncodeWithC1C3C2:(NSString *)c1c3c2Hex;
  36. + (nullable NSString *)asn1EncodeWithC1C3C2Array:(NSArray<NSString *> *)c1c3c2Array;
  37. + (nullable NSData *)asn1EncodeWithC1C3C2Data:(NSData *)c1c3c2Data;
  38. /// ASN1 解码。对 ASN1 格式的密文解码,返回值:解码后的密文
  39. /// 返回值样式:c1c3c2 直接拼接;数组依次存放 @[c1,c3,c2];NSData 类型拼接的c1c3c2
  40. /// @param asn1Hex ASN1 编码格式的密文(Hex 格式);asn1Data ASN1 编码格式的密文(NSData 格式)
  41. + (nullable NSString *)asn1DecodeToC1C3C2:(NSString *)asn1Hex;
  42. + (nullable NSArray<NSString *> *)asn1DecodeToC1C3C2Array:(NSString *)asn1Hex;
  43. + (nullable NSData *)asn1DecodeToC1C3C2Data:(NSData *)asn1Data;
  44. ///MARK: - 签名验签
  45. /// SM2 数字签名。返回值:数字签名,RS 拼接的 128 字节 Hex 格式字符串,前 64 字节是 R,后 64 字节是 S
  46. /// userID 或 userHex,用户ID 可传空值,为空时默认 1234567812345678;不为空时,签名和验签需要相同 ID
  47. /// @param plaintext 明文(普通字符串);plainHex 明文(Hex 编码格式);plainData 明文(NSData 格式)
  48. /// @param priKey SM2 私钥(Hex 编码格式)
  49. /// @param userID 用户 ID(普通字符串);userHex 用户 ID(Hex 编码格式);userID 用户 ID(NSData 格式)
  50. + (nullable NSString *)signText:(NSString *)plaintext privateKey:(NSString *)priKey userID:(nullable NSString *)userID;
  51. + (nullable NSString *)signHex:(NSString *)plainHex privateKey:(NSString *)priKey userHex:(nullable NSString *)userHex;
  52. + (nullable NSString *)signData:(NSData *)plainData priKey:(NSString *)priKey userData:(nullable NSData *)userData;
  53. /// SM2 验证数字签名。返回值:验签结果,YES 为通过,NO 为不通过
  54. /// userID 或 userHex,用户ID 可传空值,为空时默认 1234567812345678;不为空时,签名和验签需要相同 ID
  55. /// @param plaintext 明文(普通字符串);plainHex 明文(Hex 编码格式);plainData 明文(NSData 格式)
  56. /// @param signRS 数字签名,RS 拼接的 128 字节 Hex 格式字符串,前 64 字节是 R,后 64 字节是 S
  57. /// @param pubKey SM2 公钥(Hex 编码格式)
  58. /// @param userID 用户 ID(普通字符串);userHex 用户 ID(Hex 编码格式);userID 用户 ID(NSData 格式)
  59. + (BOOL)verifyText:(NSString *)plaintext signRS:(NSString *)signRS publicKey:(NSString *)pubKey userID:(nullable NSString *)userID;
  60. + (BOOL)verifyHex:(NSString *)plainHex signRS:(NSString *)signRS publicKey:(NSString *)pubKey userHex:(nullable NSString *)userHex;
  61. + (BOOL)verifyData:(NSData *)plainData signRS:(NSString *)signRS pubKey:(NSString *)pubKey userData:(nullable NSData *)userData;
  62. ///MARK: - Der 编码解码
  63. /// Der 编码。返回值:SM2 数字签名, Der 编码格式
  64. /// @param signRS RS 拼接的 128 字节 Hex 格式字符串,前 64 字节是 R,后 64 字节是 S
  65. + (nullable NSString *)derEncode:(NSString *)signRS;
  66. /// Der 解码。SM2 数字签名 Der 解码,返回值:数字签名,RS 拼接的 128 字节 Hex 格式字符串,前 64 字节是 R,后 64 字节是 S
  67. /// @param derSign Der 编码格式的数字签名
  68. + (nullable NSString *)derDecode:(NSString *)derSign;
  69. ///MARK: - ECDH 密钥协商
  70. /// 椭圆曲线 Diffie-Hellman 密钥协商(ECDH),返回 64 字节 16 进制编码格式密钥
  71. /// @param publicKey 临时公钥(其他端传入的公钥)
  72. /// @param privateKey 临时私钥(当前端生成的私钥)
  73. + (nullable NSString *)computeECDH:(NSString *)publicKey privateKey:(NSString *)privateKey;
  74. @end
  75. NS_ASSUME_NONNULL_END