Hi All
I am rather new to crypto++ hence this post.
problem:
We have a contactless memory card project. Single sign on. We wish to
encrypt user details (standard 2.0 .net stuff) then gina.dll will
decrypt the ciphertext with crypto++ then encrypt it again and send it
off to another backend server written in java. which will then decrypt
it using java (Java Cryptography Extension).
I have managed to get .net and java to get the same output. except
crypto++.
My question: is it possible for crypto++ to decrypt .net aes
encryption then encrypt it again first with aes then RSA (or ECC) to
send off to java server.... then will java server be able to decrypt
using crypto++?
(alternative solution: is it better simply to just write a crypto+
+ .net wrapper for windows administration program. keep crypto++
untouched in gina.dll and use Java's JNI to talk with a the crypto++
library on the server thus keeping everything rather standard.)
Look forward to your response
Stewart
some examples of what I am doing.
here is the out put of each example
Java
INTEGRATED encrypted is rJnW+7kr4mukfoNkv2QvJw==
rJnW+7kr4mukfoNkv2QvJw== decrypted is INTEGRATED
Crypto++
INTEGRATED encrypted is 瑱蛀?鈑僤縟/'
瑱蛀?鈑僤縟/'decrypted is INTEGRATED
.NET
INTEGRATED encrypted is rJnW+7kr4mukfoNkv2QvJw==
rJnW+7kr4mukfoNkv2QvJw== decrypted is INTEGRATED
.NET_________________________________________
using System;
using System.Security.Cryptography;
using System.Text;
namespace aes1
{
class CryptTest
{
static void Main(string[] args)
{
try
{
byte[] key = new byte[16] { 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01 };
byte[] iv = new byte[16] { 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01 };
string text="INTEGRATED";
System.Console.WriteLine(".NET");
string encrypted = encrypt(text,iv,key);
System.Console.WriteLine( text + " encrypted is " + encrypted);
string decrypted = decrypt(encrypted,iv,key);
System.Console.WriteLine( encrypted + " decrypted is " +
decrypted);
Console.ReadLine();
}
catch (Exception e)
{
System.Console.WriteLine(e.StackTrace);
}
}
public static string encrypt(string text,byte[] iv, byte[] key)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = 128;
rijndaelCipher.BlockSize = 128;
rijndaelCipher.Key = key;
rijndaelCipher.IV = iv;
ICryptoTransform transform =
rijndaelCipher.CreateEncryptor();
byte [] plainText = Encoding.UTF8.GetBytes(text);
byte[] cipherBytes =
transform.TransformFinalBlock(plainText, 0,
plainText.Length);
return Convert.ToBase64String(cipherBytes);
}
public static string decrypt(string text,byte[] iv, byte[] key)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = 128;
rijndaelCipher.BlockSize = 128;
byte[] encryptedData = Convert.FromBase64String(text);
rijndaelCipher.Key = key;
rijndaelCipher.IV = iv;
ICryptoTransform transform =
rijndaelCipher.CreateDecryptor();
byte[] plainText =
transform.TransformFinalBlock(encryptedData, 0,
encryptedData.Length);
return Encoding.UTF8.GetString(plainText);
}
}
}
_________________________________________
Java
_________________________________________
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class aes1 {
public static void main(String[] args) {
try{
byte[] key = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
byte[] iv = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
String text = "INTEGRATED";
String encrypted = encrypt(text, iv, key);
System.out.println("Java");
System.out.println(text + " encrypted is " + encrypted );
String decrypted = decrypt(encrypted,iv,key);
System.out.println(encrypted + " decrypted is " + decrypted );
}catch (Exception e){
e.printStackTrace();
}
}
public static String encrypt(String text, byte[] iv, byte[] key)
throws Exception{
Cipher cipher =
Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
byte [] results =
cipher.doFinal(text.getBytes("UTF-8"));
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(results);
}
public static String decrypt(String text, byte[] iv, byte[] key)
throws Exception{
Cipher cipher =
Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE,keySpec,ivSpec);
BASE64Decoder decoder = new BASE64Decoder();
byte [] results =
cipher.doFinal(decoder.decodeBuffer(text));
return new String(results,"UTF-8");
}
}
_________________________________________________
C++ Crypto++
_________________________________________________
#include "StdAfx.h"
// Runtime Includes
#include <iostream>
#include <iomanip>
// Crypto++ Includes
#include "cryptlib.h"
#include "aes.h" // AES
#include "modes.h" // CBC_Mode< >
#include "filters.h" // StringSource
int main(int argc, char* argv[]) {
byte key[ CryptoPP::AES::DEFAULT_KEYLENGTH ] =
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
byte iv[ CryptoPP::AES::BLOCKSIZE ] =
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01 };
std::string PlainText = "INTEGRATED";
std::cout << "\n" << "Crypto++" << std::endl;
std::cout << PlainText << " encrypted is " ;
// Cipher Text Sink
std::string CipherText;
// Encryption
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption
Encryptor( key, sizeof(key), iv );
CryptoPP::StringSource( PlainText, true,
new CryptoPP::StreamTransformationFilter( Encryptor,
new CryptoPP::StringSink( CipherText )
) // StreamTransformationFilter
); // StringSource
// Debug
std::cout << CipherText << std::endl;
///////////////////////////////////////
// DMZ //
///////////////////////////////////////
// Recovered Text Sink
std::string RecoveredText;
// Decryption
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption
Decryptor( key, sizeof(key), iv );
CryptoPP::StringSource( CipherText, true,
new CryptoPP::StreamTransformationFilter( Decryptor,
new CryptoPP::StringSink( RecoveredText )
) // StreamTransformationFilter
); // StringSink
// Debug
std::cout << CipherText << "decrypted is " << RecoveredText <<
std::endl;
std::cout << std::endl;
return 0;
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the "Crypto++ Users"
Google Group.
To unsubscribe, send an email to [EMAIL PROTECTED]
More information about Crypto++ and this group is available at
http://www.cryptopp.com.
-~----------~----~----~----~------~----~------~--~---