Advertisement
Guest User

Untitled

a guest
Jun 24th, 2017
623
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.90 KB | None | 0 0
  1. #include <assert.h>
  2. #include <iostream>
  3. #include <openssl/aes.h>
  4. #include <openssl/bio.h>
  5. #include <openssl/err.h>
  6. #include <openssl/evp.h>
  7. #include <openssl/pem.h>
  8. #include <openssl/rsa.h>
  9. #include <openssl/ssl.h>
  10.  
  11. std::string privateKey = "-----BEGIN RSA PRIVATE KEY-----\n"
  12. "MIIEowIBAAKCAQEAy8Dbv8prpJ/0kKhlGeJYozo2t60EG8L0561g13R29LvMR5hy\n"
  13. "vGZlGJpmn65+A4xHXInJYiPuKzrKUnApeLZ+vw1HocOAZtWK0z3r26uA8kQYOKX9\n"
  14. "Qt/DbCdvsF9wF8gRK0ptx9M6R13NvBxvVQApfc9jB9nTzphOgM4JiEYvlV8FLhg9\n"
  15. "yZovMYd6Wwf3aoXK891VQxTr/kQYoq1Yp+68i6T4nNq7NWC+UNVjQHxNQMQMzU6l\n"
  16. "WCX8zyg3yH88OAQkUXIXKfQ+NkvYQ1cxaMoVPpY72+eVthKzpMeyHkBn7ciumk5q\n"
  17. "gLTEJAfWZpe4f4eFZj/Rc8Y8Jj2IS5kVPjUywQIDAQABAoIBADhg1u1Mv1hAAlX8\n"
  18. "omz1Gn2f4AAW2aos2cM5UDCNw1SYmj+9SRIkaxjRsE/C4o9sw1oxrg1/z6kajV0e\n"
  19. "N/t008FdlVKHXAIYWF93JMoVvIpMmT8jft6AN/y3NMpivgt2inmmEJZYNioFJKZG\n"
  20. "X+/vKYvsVISZm2fw8NfnKvAQK55yu+GRWBZGOeS9K+LbYvOwcrjKhHz66m4bedKd\n"
  21. "gVAix6NE5iwmjNXktSQlJMCjbtdNXg/xo1/G4kG2p/MO1HLcKfe1N5FgBiXj3Qjl\n"
  22. "vgvjJZkh1as2KTgaPOBqZaP03738VnYg23ISyvfT/teArVGtxrmFP7939EvJFKpF\n"
  23. "1wTxuDkCgYEA7t0DR37zt+dEJy+5vm7zSmN97VenwQJFWMiulkHGa0yU3lLasxxu\n"
  24. "m0oUtndIjenIvSx6t3Y+agK2F3EPbb0AZ5wZ1p1IXs4vktgeQwSSBdqcM8LZFDvZ\n"
  25. "uPboQnJoRdIkd62XnP5ekIEIBAfOp8v2wFpSfE7nNH2u4CpAXNSF9HsCgYEA2l8D\n"
  26. "JrDE5m9Kkn+J4l+AdGfeBL1igPF3DnuPoV67BpgiaAgI4h25UJzXiDKKoa706S0D\n"
  27. "4XB74zOLX11MaGPMIdhlG+SgeQfNoC5lE4ZWXNyESJH1SVgRGT9nBC2vtL6bxCVV\n"
  28. "WBkTeC5D6c/QXcai6yw6OYyNNdp0uznKURe1xvMCgYBVYYcEjWqMuAvyferFGV+5\n"
  29. "nWqr5gM+yJMFM2bEqupD/HHSLoeiMm2O8KIKvwSeRYzNohKTdZ7FwgZYxr8fGMoG\n"
  30. "PxQ1VK9DxCvZL4tRpVaU5Rmknud9hg9DQG6xIbgIDR+f79sb8QjYWmcFGc1SyWOA\n"
  31. "SkjlykZ2yt4xnqi3BfiD9QKBgGqLgRYXmXp1QoVIBRaWUi55nzHg1XbkWZqPXvz1\n"
  32. "I3uMLv1jLjJlHk3euKqTPmC05HoApKwSHeA0/gOBmg404xyAYJTDcCidTg6hlF96\n"
  33. "ZBja3xApZuxqM62F6dV4FQqzFX0WWhWp5n301N33r0qR6FumMKJzmVJ1TA8tmzEF\n"
  34. "yINRAoGBAJqioYs8rK6eXzA8ywYLjqTLu/yQSLBn/4ta36K8DyCoLNlNxSuox+A5\n"
  35. "w6z2vEfRVQDq4Hm4vBzjdi3QfYLNkTiTqLcvgWZ+eX44ogXtdTDO7c+GeMKWz4XX\n"
  36. "uJSUVL5+CVjKLjZEJ6Qc2WZLl94xSwL71E41H4YciVnSCQxVc4Jw\n"
  37. "-----END RSA PRIVATE KEY-----\n\0";
  38.  
  39. std::string publicKey = "-----BEGIN PUBLIC KEY-----\n"
  40. "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy8Dbv8prpJ/0kKhlGeJY\n"
  41. "ozo2t60EG8L0561g13R29LvMR5hyvGZlGJpmn65+A4xHXInJYiPuKzrKUnApeLZ+\n"
  42. "vw1HocOAZtWK0z3r26uA8kQYOKX9Qt/DbCdvsF9wF8gRK0ptx9M6R13NvBxvVQAp\n"
  43. "fc9jB9nTzphOgM4JiEYvlV8FLhg9yZovMYd6Wwf3aoXK891VQxTr/kQYoq1Yp+68\n"
  44. "i6T4nNq7NWC+UNVjQHxNQMQMzU6lWCX8zyg3yH88OAQkUXIXKfQ+NkvYQ1cxaMoV\n"
  45. "PpY72+eVthKzpMeyHkBn7ciumk5qgLTEJAfWZpe4f4eFZj/Rc8Y8Jj2IS5kVPjUy\n"
  46. "wQIDAQAB\n"
  47. "-----END PUBLIC KEY-----\n";
  48.  
  49. RSA *createPrivateRSA(std::string key) {
  50. RSA *rsa = NULL;
  51. const char *c_string = key.c_str();
  52. BIO *keybio = BIO_new_mem_buf((void *)c_string, -1);
  53. if (keybio == NULL) {
  54. return 0;
  55. }
  56. rsa = PEM_read_bio_RSAPrivateKey(keybio, &rsa, NULL, NULL);
  57. return rsa;
  58. }
  59.  
  60. RSA *createPublicRSA(std::string key) {
  61. RSA *rsa = NULL;
  62. BIO *keybio;
  63. const char *c_string = key.c_str();
  64. keybio = BIO_new_mem_buf((void *)c_string, -1);
  65. if (keybio == NULL) {
  66. return 0;
  67. }
  68. rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa, NULL, NULL);
  69. return rsa;
  70. }
  71.  
  72. bool RSASign(RSA *rsa,
  73. const unsigned char *Msg,
  74. size_t MsgLen,
  75. unsigned char **EncMsg,
  76. size_t *MsgLenEnc) {
  77. EVP_MD_CTX *m_RSASignCtx = EVP_MD_CTX_create();
  78. EVP_PKEY *priKey = EVP_PKEY_new();
  79. EVP_PKEY_assign_RSA(priKey, rsa);
  80. if (EVP_DigestSignInit(m_RSASignCtx, NULL, EVP_sha256(), NULL, priKey) <= 0) {
  81. return false;
  82. }
  83. if (EVP_DigestSignUpdate(m_RSASignCtx, Msg, MsgLen) <= 0) {
  84. return false;
  85. }
  86. if (EVP_DigestSignFinal(m_RSASignCtx, NULL, MsgLenEnc) <= 0) {
  87. return false;
  88. }
  89. *EncMsg = (unsigned char *)malloc(*MsgLenEnc);
  90. if (EVP_DigestSignFinal(m_RSASignCtx, *EncMsg, MsgLenEnc) <= 0) {
  91. return false;
  92. }
  93. EVP_MD_CTX_destroy(m_RSASignCtx);
  94. return true;
  95. }
  96.  
  97. bool RSAVerifySignature(RSA *rsa,
  98. unsigned char *MsgHash,
  99. size_t MsgHashLen,
  100. const char *Msg,
  101. size_t MsgLen,
  102. bool *Authentic) {
  103. *Authentic = false;
  104. EVP_PKEY *pubKey = EVP_PKEY_new();
  105. EVP_PKEY_assign_RSA(pubKey, rsa);
  106. EVP_MD_CTX *m_RSAVerifyCtx = EVP_MD_CTX_create();
  107.  
  108. if (EVP_DigestVerifyInit(m_RSAVerifyCtx, NULL, EVP_sha256(), NULL, pubKey) <= 0) {
  109. return false;
  110. }
  111. if (EVP_DigestVerifyUpdate(m_RSAVerifyCtx, Msg, MsgLen) <= 0) {
  112. return false;
  113. }
  114. int AuthStatus = EVP_DigestVerifyFinal(m_RSAVerifyCtx, MsgHash, MsgHashLen);
  115. if (AuthStatus == 1) {
  116. *Authentic = true;
  117. EVP_MD_CTX_destroy(m_RSAVerifyCtx);
  118. return true;
  119. } else if (AuthStatus == 0) {
  120. *Authentic = false;
  121. EVP_MD_CTX_destroy(m_RSAVerifyCtx);
  122. return true;
  123. } else {
  124. *Authentic = false;
  125. EVP_MD_CTX_destroy(m_RSAVerifyCtx);
  126. return false;
  127. }
  128. }
  129.  
  130. void Base64Encode(const unsigned char *buffer,
  131. size_t length,
  132. char **base64Text) {
  133. BIO *bio, *b64;
  134. BUF_MEM *bufferPtr;
  135.  
  136. b64 = BIO_new(BIO_f_base64());
  137. bio = BIO_new(BIO_s_mem());
  138. bio = BIO_push(b64, bio);
  139.  
  140. BIO_write(bio, buffer, length);
  141. BIO_flush(bio);
  142. BIO_get_mem_ptr(bio, &bufferPtr);
  143. BIO_set_close(bio, BIO_NOCLOSE);
  144. BIO_free_all(bio);
  145.  
  146. *base64Text = (*bufferPtr).data;
  147. }
  148.  
  149. size_t calcDecodeLength(const char *b64input) {
  150. size_t len = strlen(b64input), padding = 0;
  151.  
  152. if (b64input[len - 1] == '=' && b64input[len - 2] == '=') //last two chars are =
  153. padding = 2;
  154. else if (b64input[len - 1] == '=') //last char is =
  155. padding = 1;
  156. return (len * 3) / 4 - padding;
  157. }
  158.  
  159. void Base64Decode(const char *b64message, unsigned char **buffer, size_t *length) {
  160. BIO *bio, *b64;
  161.  
  162. int decodeLen = calcDecodeLength(b64message);
  163. *buffer = (unsigned char *)malloc(decodeLen + 1);
  164. (*buffer)[decodeLen] = '\0';
  165.  
  166. bio = BIO_new_mem_buf(b64message, -1);
  167. b64 = BIO_new(BIO_f_base64());
  168. bio = BIO_push(b64, bio);
  169.  
  170. *length = BIO_read(bio, *buffer, strlen(b64message));
  171. BIO_free_all(bio);
  172. }
  173.  
  174. char *signMessage(std::string privateKey, std::string plainText) {
  175. RSA *privateRSA = createPrivateRSA(privateKey);
  176. unsigned char *encMessage;
  177. char *base64Text;
  178. size_t encMessageLength;
  179. RSASign(privateRSA, (unsigned char *)plainText.c_str(), plainText.length(), &encMessage, &encMessageLength);
  180. Base64Encode(encMessage, encMessageLength, &base64Text);
  181. free(encMessage);
  182. return base64Text;
  183. }
  184.  
  185. bool verifySignature(std::string publicKey, std::string plainText, char *signatureBase64) {
  186. RSA *publicRSA = createPublicRSA(publicKey);
  187. unsigned char *encMessage;
  188. size_t encMessageLength;
  189. bool authentic;
  190. Base64Decode(signatureBase64, &encMessage, &encMessageLength);
  191. bool result = RSAVerifySignature(publicRSA, encMessage, encMessageLength, plainText.c_str(), plainText.length(), &authentic);
  192. return result & authentic;
  193. }
  194.  
  195. int main() {
  196. std::string plainText = "My secret message.\n";
  197. char *signature = signMessage(privateKey, plainText);
  198. bool authentic = verifySignature(publicKey, "My secret message.\n", signature);
  199. if (authentic) {
  200. std::cout << "Authentic" << std::endl;
  201. } else {
  202. std::cout << "Not Authentic" << std::endl;
  203. }
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement