[英]How can i decrypt file in ios that was encrypted in c# using Rijndael
我在C#中有一個應用程序,使用此方法使用AES算法加密我的文件:
private static void encryptFile(string inputFile, string outputFile, string strKey)
{
try
{
using (RijndaelManaged aes = new RijndaelManaged())
{
byte[] key = Encoding.UTF8.GetBytes(strKey);
byte[] IV = Encoding.UTF8.GetBytes(strKey);
using (FileStream fsCrypt = new FileStream(outputFile, FileMode.Create))
{
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, IV))
{
using (CryptoStream cs = new CryptoStream(fsCrypt, encryptor, CryptoStreamMode.Write))
{
using (FileStream fsIn = new FileStream(inputFile, FileMode.Open))
{
int data;
while ((data = fsIn.ReadByte()) != -1)
{
cs.WriteByte((byte)data);
}
}
}
}
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
該文件被加密沒有問題。
然后,我想用我的Android(2.2)應用程序解密加密的文件。 所以我這樣做:
private void decriptFile() throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException, IOException {
//byte[] docBytes = serialize(myDoc);
byte[] b = new byte[0];
try {
Resources res = getResources();
InputStream in_s = res.openRawResource(R.raw.output27);
b = new byte[in_s.available()];
in_s.read(b);
//txtHelp.setText(new String(b));
} catch (Exception e) {
// e.printStackTrace();
//txtHelp.setText("Error: can't show help.");
}
//byte[] dataBytes = FileUtils.readFileToByteArray(File file);
byte[] key = new byte[0];
try {
// key = ("HR$2pIjHR$2pIj12").getBytes("UTF-8");
key = ("HR$2pIjHR$2pIj12").getBytes("UTF-8");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec k = new SecretKeySpec(key, "AES");
IvParameterSpec iv = new IvParameterSpec(key);
c.init(Cipher.DECRYPT_MODE, k, iv);
// IllegalBlockSizeException Occurred
//File folder = new File(Environment.getExternalStorageDirectory(),
//"test");
File folder = new File("/sdcard",
"test");
if (!folder.exists()) {
folder.mkdir();
}
byte[] decryptedDocBytes = c.doFinal(b);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(folder.getPath()+"/test.epub"));
bos.write(decryptedDocBytes);
bos.flush();
bos.close();
//DocumentsContract.Document decryptedDoc = (DocumentsContract.Document)deserialize(decryptedDocBytes);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//IvParameterSpec iv = new IvParameterSpec(key);
//And my serialize/deserialize methods:
}
這次解密工作正常,要使用以下方法在Objective CI中解密相同文件:
- (NSData *)decrypt:(NSData *)plainText key:(NSData *)aSymmetricKey padding:(CCOptions *)pkcs7
{
//return [self doCipher:plainText key:aSymmetricKey context:kCCDecrypt padding:pkcs7];
return [self doCipher2:plainText iv:[self generateRandomIV:128] key:aSymmetricKey context:kCCDecrypt error:nil];
}
- (NSData *)doCipher2:(NSData *)dataIn
iv:(NSData *)iv
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
error:(NSError **)error
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0;
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];
ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmAES128,
0, //kCCOptionPKCS7Padding,
symmetricKey.bytes,
kCCKeySizeAES128,
iv.bytes,
dataIn.bytes,
dataIn.length,
dataOut.mutableBytes,
dataOut.length,
&cryptBytes);
if (ccStatus == kCCSuccess) {
dataOut.length = cryptBytes;
}
else {
if (error) {
*error = [NSError errorWithDomain:@"kEncryptionError"
code:ccStatus
userInfo:nil];
}
dataOut = nil;
}
return dataOut;
}
這次沒有運氣了,這可能是什么問題? 任何幫助,將不勝感激。
在Android版本中,您指定PKCS5Padding
但在iOS版本中未填充它。 請注意, PKCS5Padding
和PKCS7Padding
的作用相同,只是定義不同。
更改:
0, //kCCOptionPKCS7Padding,
至
kCCOptionPKCS7Padding,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.