2013-05-20 90 views
1

首先,我在過去幾天中搜索了這個問題,但是我發現的一切都不起作用。我沒有收到運行時錯誤,但是當我輸入程序生成的相同密鑰(以十六進制字符串的形式)進行加密時,解密失敗(但在整個程序中使用生成的密鑰工作正常)。我試圖輸入一個十六進制字符串(格式:00:00:00 ...)並將其變成一個32字節的字節數組。輸入來自getpass()。我之前在Java和C#中完成了這個工作,但我是C++的新手,一切看起來都複雜得多。任何幫助將不勝感激:)另外,我在Linux平臺上編程,所以我想避免僅Windows功能。C++十六進制字符串到字節數組

這裏是什麼,我已經試過一個例子:

char *pass = getpass("Key: "); 

std::stringstream converter; 
std::istringstream ss(pass); 
std::vector<byte> bytes; 

std::string word; 
while(ss >> word) 
{ 
    byte temp; 
    converter << std::hex << word; 
    converter >> temp; 
    bytes.push_back(temp); 
} 
byte* keyBytes = &bytes[0]; 

回答

1

如果輸入的格式有:AA:BB:CC, 你可以寫這樣的事情:

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 
#include <cstdint> 

struct hex_to_byte 
{ 
    static uint8_t low(const char& value) 
    { 
     if(value <= '9' && '0' <= value) 
     { 
      return static_cast<uint8_t>(value - '0'); 
     } 
     else // ('A' <= value && value <= 'F') 
     { 
      return static_cast<uint8_t>(10 + (value - 'A')); 
     } 
    } 

    static uint8_t high(const char& value) 
    { 
     return (low(value) << 4); 
    } 
}; 

template <typename InputIterator> 
std::string from_hex(InputIterator first, InputIterator last) 
{ 
    std::ostringstream oss; 
    while(first != last) 
    { 
     char highValue = *first++; 
     if(highValue == ':') 
      continue; 

     char lowValue = *first++; 

     char ch = (hex_to_byte::high(highValue) | hex_to_byte::low(lowValue)); 
     oss << ch; 
    } 

    return oss.str(); 
} 

int main() 
{ 
    std::string pass = "AB:DC:EF"; 
    std::string bin_str = from_hex(std::begin(pass), std::end(pass)); 
    std::vector<std::uint8_t> v(std::begin(bin_str), std::end(bin_str)); // bytes: [171, 220, 239] 
    return 0; 
} 
+0

謝謝,這是有幫助的,但我無法訪問輸出爲字節[],因爲解密方法輸入參數非常具體。 –

+0

對不起,我不確定是什麼問題。你可以再詳細一點嗎? –

+0

我需要傳遞字節的方法看起來像'SetKey(const byte * key)'(http://www.cryptopp.com/docs/ref/class_simple_keying_interface.html#adf3c29b3ef3af74788a58c7c49887fd7) –

-1

如何對這個?

閱讀它作爲一個單詞後,對它進行操作? 您可以在convert()中檢查任何大小的檢查格式。

#include <iostream> 
#include <string> 
#include <vector> 

char convert(char c) 
{ 
    using namespace std; 
    // do whatever decryption stuff you want here 
    return c; 
} 

void test() 
{ 
    using namespace std; 

    string word; 
    cin >> word; 

    vector<char> password; 

    for (int i = 0; i < word.length(); i++) 
    { 
     password.push_back(convert(word[i])); 
    } 

    for (int i = 0; i < password.size(); i++) 
    { 
     cout << password[i]; 
    } 

    cout << ""; 
} 

int main() 
{ 
    using namespace std; 
    char wait = ' '; 

    test(); 

    cin >> wait; 
} 

在這裏沒有使用cin的具體原因是什麼?

+1

我儘量不要使用cin,只是因爲它是一個正在輸入的加密密鑰,並且可以保存終端輸入的日誌。 –

相關問題