Re: Get ASCII value for character when higher than 127
On Tue, 05 Jun 2007 15:31:22 GMT, MrAsm <mrasm@usa.com> wrote:
I think that when you have a 0x0A character (resulted from your XOR
obfuscation) and you write it to output stream, it is written as 0x0D
0x0A pair to file, so when you read data back from C#, things get
corrupted (you have the spurious 0x0D).
....or maybe you are writing your crypted data as simple Ascii strings
and not in binary file format, so maybe you don't have the \n
conversion problem.
However, this is my C++ and C# code, that works.
<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;
}
//
// TEST
//
std::string value = "11223AABBcH";
std::string key = "Ciao";
CharArray result = XorStringCrypt( value, key );
// Save in binary mode (ios_base::binary),
// to avoid conversion from 0x0A to 0x0D 0x0A
std::ofstream out(
"n:\\crypt.test",
std::ios_base::out | std::ios_base::binary
);
for ( CharArray::const_iterator it = result.begin(); it !=
result.end(); ++it )
{
out.put( *it );
}
</CODE>
<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);
}
/// <summary>
/// Test decrypt
/// </summary>
private void button1_Click(object sender, EventArgs e)
{
// Read file data into memory
FileStream inputFile = new FileStream(
@"N:\crypt.test",
FileMode.Open);
int bytesCount = (int)inputFile.Length;
byte[] byteArray = new byte[bytesCount];
inputFile.Read(byteArray, 0, bytesCount);
inputFile.Close();
string decrypted = XorDecrypt(byteArray, "Ciao");
MessageBox.Show(decrypted);
}
</CODE>
MrAsm