我正在考虑用Java为移动平台操作系统开发一个应用程序。
我已经为C#环境开发了一个Windows应用程序。我使用密码流,以便使用以下代码对字符串进行加密和解密。下面显示的代码仅用于加密
public string encrypt(string encryptionString)
{
byte[] clearTextBytes = Encoding.UTF8.GetBytes(encryptionString);
SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
MemoryStream ms = new MemoryStream();
byte[] rgbIV = Encoding.ASCII.GetBytes("ryojvlzmdalyglrj");
byte[] key = Encoding.ASCII.GetBytes("hcxilkqbbhczfeultgbskdmaunivmfuo");
CryptoStream cs = new CryptoStream(ms, rijn.CreateEncryptor(key, rgbIV), CryptoStreamMode.Write);
cs.Write(clearTextBytes, 0, clearTextBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}加密的字符串被存储在在线数据库中。我需要做的是让java应用程序能够从数据库中读取字符串,并使用来自C#应用程序的相同加密密钥对字符串进行解密。
谢谢你的帮助。
发布于 2011-01-05 06:49:43
就我个人而言,我喜欢BouncyCastle for Java crypto。下面的代码(使用BouncyCastle轻量级应用程序接口)应该可以做到这一点:
String decrypt(byte[] cryptoBytes, byte[] key, byte[] iv) {
BlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
cipher.init(false, new ParametersWithIV(new KeyParameter(key), iv));
byte[] out = new byte[cipher.getOutputSize(cryptoBytes.length)];
int offset = cipher.processBytes(cryptoBytes, 0, cryptoBytes.length, out, 0);
cipher.doFinal(out, offset);
return new String(out);
}我发现BouncyCastle的轻量级API没有JCE提供程序那么麻烦,但如果您愿意,可以将其用作提供程序。
看起来.net SymmetricAlgorithm和BC的PaddedBufferedBlockCipher都缺省为PKCS7填充,所以您应该可以使用缺省值。
发布于 2011-01-05 06:37:18
你可能想看看javax.crypto.CipherInputStream和javax.crypto.CipherOutputStream。
http://download.oracle.com/javase/1.5.0/docs/api/javax/crypto/CipherInputStream.html http://download.oracle.com/javase/1.5.0/docs/api/javax/crypto/CipherOutputStream.html
它们的使用方法与上面的示例几乎完全相同,尽管Cipher对象的初始化可能略有不同。
发布于 2011-01-05 06:54:06
我使用下面的代码在.net和java之间进行加密
在.net中,我使用:
/// <summary>
/// DES Encryption method - used to encryp password for the java.
/// </summary>
/// <param name="plainText"></param>
/// <returns></returns>
public string EncryptData(string plainText)
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
des.Key = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
des.IV = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
byte[] bytes = Encoding.UTF8.GetBytes(plainText);
byte[] resultBytes = des.CreateEncryptor().TransformFinalBlock(bytes, 0, bytes.Length);
return Convert.ToBase64String(resultBytes);
}
/// <summary>
/// DES Decryption method - used the decrypt password encrypted in java
/// </summary>
/// <param name="encryptedText"></param>
/// <returns></returns>
public string DecryptData(string encryptedText)
{
DES des = new DESCryptoServiceProvider();
des.Mode = CipherMode.ECB;
des.Padding = PaddingMode.PKCS7;
des.Key = Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
des.IV = System.Text.Encoding.UTF8.GetBytes(_secretPhrase.Substring(0, 8));
byte[] bytes = Convert.FromBase64String(encryptedText);
byte[] resultBytes = des.CreateDecryptor().TransformFinalBlock(bytes, 0, bytes.Length);
return Encoding.UTF8.GetString(resultBytes);
}在java中,我使用:
公共类CryptoUtil {
public static final Logger LOG = Logger.getLogger(CryptoUtil.class);
private Cipher cipher = null;
private SecretKey key = null;
// This variable holds a string based on which a unique key will be generated
private static final String SECRET_PHRASE = "SECRET PHRASE GOES HERE";
// Charset will be used to convert between String and ByteArray
private static final String CHARSET = "UTF8";
// The algorithm to be used for encryption/decryption DES(Data Encryption Standard)
private static final String ALGORITHM = "DES";
public CryptoUtil() throws DDICryptoException {
try {
// generate a key from SecretKeyFactory
DESKeySpec keySpec = new DESKeySpec(SECRET_PHRASE.getBytes(CHARSET));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
key = keyFactory.generateSecret(keySpec);
cipher = Cipher.getInstance(ALGORITHM);
} catch (Exception e) {
LOG.error(e);
throw new DDICryptoException(e);
}
}
/**
* This method takes a plain text string and returns encrypted string using DES algorithm
* @param plainText
* @return String
* @throws DDICryptoException
*/
public String encrypt(String plainText) throws DDICryptoException {
String encryptedString = null;
try {
// initializes the cipher with a key.
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] plainTextAsUTF8 = plainText.getBytes(CHARSET);
// decrypts data in a single-part or multi-part operation
byte[] encryptedBytes = cipher.doFinal(plainTextAsUTF8);
encryptedString = new sun.misc.BASE64Encoder().encode(encryptedBytes);
} catch (Exception e) {
LOG.error(e);
throw new DDICryptoException(e);
}
return encryptedString;
}
/**
* This method takes a plain text string and returns encrypted string using DES algorithm
* @param encryptedString
* @return
* @throws DDICryptoException
*/
public String decrypt(String encryptedString) throws DDICryptoException {
String decryptedString = null;
try {
byte[] decodedString = new sun.misc.BASE64Decoder().decodeBuffer(encryptedString);
// initializes the cipher with a key.
cipher.init(Cipher.DECRYPT_MODE, key);
// decrypts data in a single-part or multi-part operation
byte[] decryptedBytes = cipher.doFinal(decodedString);
decryptedString = new String(decryptedBytes, CHARSET);
} catch (Exception e) {
LOG.error(e);
throw new DDICryptoException(e);
}
return decryptedString;
}}
https://stackoverflow.com/questions/4599113
复制相似问题