Re: Get ASCII value for character when higher than 127
On 30 May 2007 03:55:32 -0700, ssetz@wxs.nl wrote:
I do only need to change my XOR function, because the rest is working.
OK, this is my C++ version of XOR function:
<CODE language="C++">
//
// Crypt a string using XOR.
//
// The result is stored into a char-array.
// The string terminating NUL character is not crypted and
// is not copied into the destination array.
//
typedef std::vector< char > CharArray;
CharArray XorStringCrypt(
const std::string & value,
const std::string & key )
{
if ( value.empty() )
throw std::invalid_argument(
"XorStringCrypt: Input array is empty" );
if ( key.empty() )
throw std::invalid_argument(
"XorStringCrypt: Key string is empty" );
CharArray result;
result.resize( value.length() );
const size_t valueLengtht = value.length();
const size_t keyLength = key.length();
size_t keyIndex = 0;
for ( size_t i = 0; i < valueLengtht; i++ )
{
result.at(i) = value.at(i) ^ key.at(keyIndex);
keyIndex++;
if ( keyIndex == keyLength )
keyIndex = 0;
}
return result;
}
</CODE>
You can use the function like this:
// Crypt the message
std::string value = "The secret message";
std::string key = "Ciao";
CharArray result = XorStringCrypt( value, key );
// Save the array to file
std::ofstream out("c:\\crypt.test");
for ( CharArray::const_iterator it = result.begin();
it != result.end(); ++it )
{
out.put( *it );
}
This is the C# side:
<CODE language="C#">
// Apply XOR to an array
private static byte[] XorArrayCrypt(byte[] encrypted, byte[] key)
{
byte[] decrypted = new byte[ encrypted.Length ];
int k = 0;
int i = 0;
for ( i = 0; i < encrypted.Length; i++ )
{
decrypted[i] = (byte) (encrypted[i] ^ key[k]);
k++;
if (k == key.Length)
k = 0;
}
return decrypted;
}
// Decrypt a string stored in encrypted byte array, using XOR
private static string XorDecrypt(byte[] encrypted, string key)
{
UTF8Encoding encoding = new UTF8Encoding();
byte[] keyBytes = encoding.GetBytes(key);
byte[] decryptedBytes = XorArrayCrypt(encrypted, keyBytes);
return encoding.GetString(decryptedBytes);
}
</CODE>
You can use them as follow:
// Test decrypt
private void button1_Click(object sender, EventArgs e)
{
//
// Read file data into memory
//
FileStream inputFile = new FileStream(@"C:\crypt.test",
FileMode.Open);
int bytesCount = (int)inputFile.Length;
byte[] byteArray = new byte[bytesCount];
inputFile.Read(byteArray, 0, bytesCount);
inputFile.Close();
//
// Decrypt (key is "Ciao")
//
string decrypted = XorDecrypt(byteArray, "Ciao");
MessageBox.Show(decrypted);
}
</CODE>
It works fine, displaying from C#: "The secret message".
HTH
MrAsm