I'm trying to encrypt data using DES CBC PKCS#5 packing, but I am
unable to achive encryption results matching that of java.
For the sake of debugging the issue I'm using an encryption key of 8
bytes (all zero) and an iv token of 8 bytes (all zero) both in java
and in C++.
In Java using the SUN JCE security provider and the IBM JCE Security
provider I get consistent results that are correct. Using Crypto++ I
must be doing something wrong .. but I cant figure it out.
Here is the java function for reference
===========================================================
// This method encrypts the usreid/password with the middle 8
bytes of
// the generated secret key and an encryption token. Then it
returns the
// encrypted data in a byte array.
// plainText The byte array form userid/password to encrypt.
// initVector The byte array which is used to calculate the
// encryption token.
// targetPublicKey DERBY' public key.
// Returns the encrypted data in a byte array.
public byte[] encryptData(byte[] plainText,
int securityMechanism,
byte[] initVector,
byte[] targetPublicKey) throws
SqlException {
byte[] cipherText = null;
byte[] cipherText2 = null;
java.security.Key key = null;
if (token_ == null) {
// token_ = calculateEncryptionToken(securityMechanism,
initVector);
// hardcode iv token to all zeros for debugging purposes
token_ = new byte[8];
token_[0]=0;
token_[1]=0;
token_[2]=0;
token_[3]=0;
token_[4]=0;
token_[5]=0;
token_[6]=0;
token_[7]=0;
}
// Hardcode the security key for debugging purposes - all
zeros
secKey_ = new byte[8];
secKey_[0]=0;
secKey_[1]=0;
secKey_[2]=0;
secKey_[3]=0;
secKey_[4]=0;
secKey_[5]=0;
secKey_[6]=0;
secKey_[7]=0;
try {
// //use this encryption key to initiate a
SecretKeySpec object
// secKey_ = generatePrivateKey(targetPublicKey);
javax.crypto.spec.SecretKeySpec desKey = new
javax.crypto.spec.SecretKeySpec(secKey_, "DES");
key = desKey;
// } else {
// //use this encryption key to initiate a
SecretKeySpec object
// javax.crypto.spec.DESKeySpec desKey = new
javax.crypto.spec.DESKeySpec(secKey_);
// if (secretKeyFactory_ == null) {
// secretKeyFactory_ =
javax.crypto.SecretKeyFactory.getInstance("DES", providerName);
// }
// key = secretKeyFactory_.generateSecret(desKey);
// }
//We use DES in CBC mode because this is the mode used in
PROTOCOL. The
//encryption mode has to be consistent for encryption and
decryption.
//CBC mode requires an initialization vector(IV)
parameter. In CBC mode
//we need to initialize the Cipher object with an IV,
which can be supplied
// using the javax.crypto.spec.IvParameterSpec class.
javax.crypto.Cipher cipher =
javax.crypto.Cipher.getInstance("DES/CBC/PKCS5Padding", "SunJCE"); //
providerName
javax.crypto.Cipher cipher2 =
javax.crypto.Cipher.getInstance("DES/CBC/PKCS5Padding", "IBMJCE"); //
providerName
//generate a IVParameterSpec object and use it to initiate
the
//Cipher object.
javax.crypto.spec.IvParameterSpec ivParam = new
javax.crypto.spec.IvParameterSpec(token_);
javax.crypto.spec.IvParameterSpec ivParam2 = new
javax.crypto.spec.IvParameterSpec(token_);
//initiate the Cipher using encryption mode, encryption
key and the
//IV parameter.
cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, key,
ivParam);
cipher2.init(javax.crypto.Cipher.ENCRYPT_MODE, key,
ivParam2);
//Execute the final phase of encryption
cipherText = cipher.doFinal(plainText);
cipherText2 = cipher2.doFinal(plainText);
} catch (java.security.NoSuchProviderException e) {
throw new SqlException(agent_.logWriter_, e,
"java.security.NoSuchProviderException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
} catch (java.security.NoSuchAlgorithmException e) {
throw new SqlException(agent_.logWriter_, e,
"java.security.NoSuchAlgorithmException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
} catch (java.security.InvalidKeyException e) {
throw new SqlException(agent_.logWriter_, e,
"java.security.InvalidKeyException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
} catch (javax.crypto.NoSuchPaddingException e) {
throw new SqlException(agent_.logWriter_, e,
"javax.crypto.NoSuchPaddingException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
} catch (javax.crypto.BadPaddingException e) {
throw new SqlException(agent_.logWriter_, e,
"javax.crypto.BadPaddingException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
} catch (java.security.InvalidAlgorithmParameterException e) {
throw new SqlException(agent_.logWriter_, e,
"java.security.InvalidAlgorithmParameterException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
} catch (javax.crypto.IllegalBlockSizeException e) {
throw new SqlException(agent_.logWriter_, e,
"javax.crypto.IllegalBlockSizeException is caught "
+ "when encrypting data '" + e.getMessage() +
"'");
/* } catch (java.security.spec.InvalidKeySpecException e) {
throw new SqlException(agent_.logWriter_, e,
"javax.crypto.IllegalBlockSizeException is caught "
+ "when encrypting data '" + e.getMessage() +
"'"); */
}
return cipherText;
}
==================================================================
and a snippet of the C++ code for reference as well.
char szEncryptionKey[CryptoPP::DES::DEFAULT_KEYLENGTH];
char iv[CryptoPP::DES::BLOCKSIZE ];
char szEncryptedUserID[512];
char szEncryptedPassword[512];
char szPaddedUserID[256];
char szPaddedPassword[256];
char szDecryptedUserID[512];
char szDecryptedPassword[512];
memset(szEncryptionKey,0,8);
memset(iv,0,8);
sprintf(szPaddedUserID, "%s", GetDatabaseMessage()-
>GetDatabaseUserName());
sprintf(szPaddedPassword, "%s", GetDatabaseMessage()-
>GetDatabasePassword());
int nSizeUserID = strlen(szPaddedUserID);
int nSizePassword = strlen(szPaddedPassword);
CryptoPP::DESEncryption desE((const byte *)szEncryptionKey,
CryptoPP::DES::DEFAULT_KEYLENGTH);
CryptoPP::CBC_Mode_ExternalCipher::Encryption modeE(desE, (const byte
*)iv);
std::string ciphertext;
CryptoPP::StreamTransformationFilter cryptoEnc(modeE, new
CryptoPP::StringSink( ciphertext ) ,
CryptoPP::StreamTransformationFilter::PKCS_PADDING);
cryptoEnc.Put((const byte *)szPaddedUserID,strlen(szPaddedUserID));
cryptoEnc.MessageEnd();
==================================================================
ciphertext in C++ does not match the ciphertext in java.
Thanks
lm
--~--~---------~--~----~------------~-------~--~----~
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.
-~----------~----~----~----~------~----~------~--~---