|
Подскажите в libgcrypt по gcry_cipher_decrypt
#38686419
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
|
|
|
|
smald,
все разобрался, так работает, спасибо что не бросили )) тудасюда hex гоняется нормально, там путаница была у меня с размерами и попыткой посчитать длину строки через strlen у шифрованного буфера unsigned char*, который переодически получался РАЗНЫЙ!!! видать strlen нельзя посчитать такие вещи ))
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
#define ENCR 1
#define DECR 0
string Crypt(int encdec, const char* pass, const char* salt, const char* text, size_t textLen)
{
if (!gcry_check_version(GCRYPT_VERSION))
{
syslog(LOG_ERR, "libgcrypt version mismatch\n");
return "";
}
gcry_error_t gcryError;
gcry_cipher_hd_t hd;
char* outBuff;
gcryError = gcry_cipher_open(&hd, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_CTS);
if (gcryError)
{
syslog(LOG_ERR, "gcry_cipher_open failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
return "";
}
gcryError = gcry_cipher_setkey(hd, pass, strlen(pass));
if (gcryError)
{
syslog(LOG_ERR, "gcry_cipher_setkey failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
return "";
}
gcryError = gcry_cipher_setiv(hd, salt, strlen(salt));
if (gcryError)
{
syslog(LOG_ERR, "gcry_cipher_setiv failed: %s/%s\n", gcry_strsource(gcryError),gcry_strerror(gcryError));
return "";
}
stringstream buff("");
switch(encdec)
{
case ENCR:
outBuff = (char*)malloc(textLen);
gcryError = gcry_cipher_encrypt(hd, outBuff, textLen, text, textLen);
if (gcryError)
{
syslog(LOG_ERR, "gcry_cipher_encrypt failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
return "";
}
for (size_t i = 0; i < textLen; i++)
buff << setfill('0') << setw(2) << hex << (unsigned int)(unsigned char)outBuff[i];
break;
case DECR:
char ch[2];
for (int i = 0; i < textLen; i += 2)
{
sprintf(ch, "%c%c", text[i], text[i+1]);
buff << (unsigned char)strtoul(ch, NULL, 16);
}
textLen /= 2;
outBuff = (char*)malloc(textLen + 1);
outBuff[textLen] = 0;
gcryError = gcry_cipher_decrypt(hd, outBuff, textLen, buff.str().c_str(), textLen);
if (gcryError)
{
syslog(LOG_ERR, "gcry_cipher_decrypt failed: %s/%s\n", gcry_strsource(gcryError), gcry_strerror(gcryError));
return "";
}
buff.str(outBuff);
}
free(outBuff);
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
gcry_cipher_close(hd);
//memset(&hd, 0, sizeof(hd));
return buff.str();
}
|
|
|