virlinz
asked on
Encryption in Visual C++
hello!
I've to do a simple assignment on encryption and I came across this article. I wish to try it using Visual C++.
http://www.codeproject.com/netcf/teaencryption.asp
TEA encrypts 64 data bits at a time using a 128 bit key.
What I understand from the article is strings must be converted into array of bytes.
1) Can we convert a string to an array of bytes?
2) Say I have CString m_strInput and int TEA[16]. Is it correct if I assign 64bits of user-input data into every element of TEA? I don't quite get how to convert the string and split them up into the array.
I guess that's all for now. I think once I get the solution to this one I can proceed to understanding how TEA works. I've never done encryption before, I'm quite loss on how to start coding.
Thank you in advance for your help and guidance.
I've to do a simple assignment on encryption and I came across this article. I wish to try it using Visual C++.
http://www.codeproject.com/netcf/teaencryption.asp
TEA encrypts 64 data bits at a time using a 128 bit key.
What I understand from the article is strings must be converted into array of bytes.
1) Can we convert a string to an array of bytes?
2) Say I have CString m_strInput and int TEA[16]. Is it correct if I assign 64bits of user-input data into every element of TEA? I don't quite get how to convert the string and split them up into the array.
I guess that's all for now. I think once I get the solution to this one I can proceed to understanding how TEA works. I've never done encryption before, I'm quite loss on how to start coding.
Thank you in advance for your help and guidance.
If you want to work with CString, then you have to convert (because buffer will be converted to binary and could have null characters), but it is simple.
CString str = "some data here";
CByteArray arr;
arr.RemoveAll(); // Optional, to reuse it.
for (int i=0; i<str.GetLength(); i++)
arr.Add(str[i]);
Now you can pass arr.GetData() to any function that requires it.
CString str = "some data here";
CByteArray arr;
arr.RemoveAll(); // Optional, to reuse it.
for (int i=0; i<str.GetLength(); i++)
arr.Add(str[i]);
Now you can pass arr.GetData() to any function that requires it.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
thanks for providing me the answers.
I don't quite understand how CByteArray works. Do we use it like the normal array? What's the difference between the CDWordArray and the other array family members?
I don't quite understand how CByteArray works. Do we use it like the normal array? What's the difference between the CDWordArray and the other array family members?
I thought you have discarded my answer, because it has not been accepted.
CByteArray is a Visual C++ MFC object that wraps and manages a simple byte array. It is similar to CDWordArray except that you fill it a byte at a time instead of a DWord (4 bytes) at a time.
As I said, you can use is by calling it's GetData member which returns you the pointer to the actual buffer (different from the pointer to the object itself).
The advantage of using a CArray derived class: you don't have to worry about memory allocation issues.
CByteArray is a Visual C++ MFC object that wraps and manages a simple byte array. It is similar to CDWordArray except that you fill it a byte at a time instead of a DWord (4 bytes) at a time.
As I said, you can use is by calling it's GetData member which returns you the pointer to the actual buffer (different from the pointer to the object itself).
The advantage of using a CArray derived class: you don't have to worry about memory allocation issues.
ASKER
btw sorry about the points. this is my first time posting a question so I got confused with the 'marking scheme' (I didn't read the FAQ first). I agree and accept all the answers. I'm really sorry about that :D
ASKER
Sorry about that Jaime. I thought I can accept all answers so I started pushing the button from the last answer :D
So for CByteArray, when copying using the for loop in ur example, str[0] means "s" while CDWordArray str[0]="some", am I right?
So for CByteArray, when copying using the for loop in ur example, str[0] means "s" while CDWordArray str[0]="some", am I right?
Yes, you are right.
ASKER
ok.. say after I transfer all this into the array I want to convert them into hexadecimal numbers. How can I do that? I can't use the Format() cuz it will convert into hex but as a CString type. I want the hex to be stored as int.
You can use Format() anyway as you expect because have to convert to hex every character, so you have to do a for... loop
CByteArray arr;
// some process who fills array here
CString hexString;
CString number;
hexString.Empty();
for (int i=0; i<arr.GetSize(); i++) {
number.Format("%02X", arr[i]);
hexString += number;
}
CByteArray arr;
// some process who fills array here
CString hexString;
CString number;
hexString.Empty();
for (int i=0; i<arr.GetSize(); i++) {
number.Format("%02X", arr[i]);
hexString += number;
}
ASKER
I tried run the codes. curious to see what is stored in every hexString element, I add a few lines after your codes
CString output;
output=hexString[0];
I entered virlinz. I'm supposed to get 75 but instead only 7 was the output. How to get 75? Does this mean the hex string now takes two places (eg. hexString[0] and hexString[1]) for each converted char?
CString output;
output=hexString[0];
I entered virlinz. I'm supposed to get 75 but instead only 7 was the output. How to get 75? Does this mean the hex string now takes two places (eg. hexString[0] and hexString[1]) for each converted char?
If you want a hex string representation, it will take 2 bytes for each converted char.
But you simply can use the CByteArray directly. arr[0] will be 75 (or its decimal representation, that depend just of point of view). Numbers are not stored as decimals or hexas, them are allways stored as binaries, decimal or hexa is just a display option.
But you simply can use the CByteArray directly. arr[0] will be 75 (or its decimal representation, that depend just of point of view). Numbers are not stored as decimals or hexas, them are allways stored as binaries, decimal or hexa is just a display option.
The easiest way to do this is with a union of the the string (char array) and a uint array:
char cThing[128];
uint uTHing[56];