Interop AES algorithem in .Net,android Java和ios [英] Interop AES algorithem in .Net , android Java and ios

查看:70
本文介绍了Interop AES algorithem in .Net,android Java和ios的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

需要在c#.net,android和ios中实现AES alogorithem。即在.net c中加密来自android和decryptiopn#div div =h2_lin>解决方案

这个问题毫无意义。算法在所有情况下都是相同的。根据语言的不同,实现可能会有所不同。请参阅:

http://en.wikipedia.org/wiki/Advanced_Encryption_Standard [< a href =http://en.wikipedia.org/wiki/Advanced_Encryption_Standardtarget =_ blanktitle =New Window> ^ ],

http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf [< a href =http://csrc.nist.gov/publications/fips/fips197/fips-197.pdftarget =_ blanktitle =New Window> ^ ]。



此外,原则上,您可以在所有这些平台上使用Mono并使用C#和.NET程序集 System.Security.Cryptography 或Java,使用Java类 javax.crypto.Cipher ,也在所有这些平台上。请参阅:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes%28v=vs.110%29.aspx [ ^ ],

http://docs.oracle.com/javase/7 /docs/api/javax/crypto/Cipher.html [ ^ ]。



-SA


在.Net:

----------------------------------- -

使用System;

使用System.Collections.Generic;

使用System.IO;

使用System .Security.Cryptography;

使用System.Text;



名称空间图层

{



公共类加密

{



公共静态字符串EncryptString(string plainSourceStringToEncrypt,string passPhrase)

{

//设置加密对象

使用(AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passPhrase)))

{

byte [] sourceBytes = Encoding.ASCII.GetBytes(plainSourceStringToEncrypt);

ICryptoTransform ictE = acsp.CreateEncryptor();



//设置流以包含加密

MemoryStream msS = new MemoryStream();



//执行加密,将输出存储到流中

CryptoStream csS = new CryptoStream(msS,ictE,CryptoStreamMode.Write);

csS.Write( sourceBytes,0,sourceBytes.Length);



csS.FlushFinalBlock();



// sourceBytes现在加密为安全字节数组

byte [] encryptedBytes = msS.ToArray(); //。ToArray()很重要,不要乱用缓冲区



//将加密字节作为BASE64编码字符串返回

返回Convert.ToBase64String(encryptedBytes);

}

}





public static string DecryptString(string base64StringToDecrypt,string passphrase)

{

//设置加密对象

using(AesCryptoServiceProvider acsp = GetProvider (Encoding.Default.GetBytes(passphrase)))

{

byte [] RawBytes = Convert.FromBase64String(base64StringToDecrypt);

ICryptoTransform ictD = acsp.CreateDecryptor();



//解密到流中

MemoryStream msD = new MemoryStream(RawBytes,0,RawBytes.Length) ;



CryptoStream csD = new CryptoStream(msD,ictD,CryptoStreamMode.Read);

// csD现在包含原始字节数组,完全解密





//将msD的内容作为常规字符串返回

return(new StreamReader(csD))。ReadToEnd();



}

}





私有静态AesCryptoServiceProvider GetProvider(byte [] key)

{

AesCryptoServiceProvider result = new AesCryptoServiceProvider();

result.BlockSize = 128;

result.KeySize = 128 ;

result.Mode = CipherMode.CBC;

result.Padding = PaddingMode.PKCS7;



结果.IV =新字节[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

结果.Key = key;

返回结果;

}




private static byte [] GetKey(byte [] suggestedKey,SymmetricAlgorithm p)

{

byte [] kRaw = suggestedKey;

List< byte> kList = new List< byte>();



for(int i = 0; i< p.LegalKeySizes [0] .MinSize; i + = 8)

{

kList.Add(kRaw [(i / 8)%kRaw.Length]);

}

byte [] k = kList.ToArray();

返回k;

}

}

}



==============



在Xcode:

----------



#importStringEncryption.h

#导入NSData + Base64.h



#if DEBUG

#define LOGGING_FACILITY(X,Y)\

NSAssert(X,Y);



#define LOGGING_FACILITY1(X,Y,Z)\

NSAssert1(X,Y,Z);

#else

#define LOGGING_FACILITY(X,Y)\

if(!(X)){\

NSLog(Y); \

退出(-1); \

}



#define LOGGING_FACILITY1(X,Y,Z)\

if(! (X)){\

NSLog(Y,Z); \

退出(-1); \

}

#endif



@implementation StringEncryption



NSString * _key = @key;

CCOptions padding = kCCOptionPKCS7Padding;







+(NSString *)EncryptString:(NSString *)plainSourceStringToEncrypt

{



StringEncryption * crypto = [[StringEncryption alloc] init];



NSData * _secretData = [plainSourceStringToEncrypt dataUsingEncoding:NSASCIIStringEncoding];



NSData * encryptedData = [crypto encrypt:_secretData key:[_ key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];



return [encryptedData base64EncodingWithLineLength:0];



}





+(NSString *)DecryptString:(NSString *) base64StringToDecrypt

{

StringEncryption * crypto = [[StringEncryption alloc] init];

NSDa ta * data = [crypto decrypt:[NSData dataWithBase64EncodedString:base64StringToDecrypt] key:[_ key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];

return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; < b / b






- (NSData *)加密:(NSData * )plainText键:(NSData *)aSymmetricKey填充:(CCOptions *)pkcs7

{

return [self doCipher:plainText key:aSymmetricKey context:kCCEncrypt padding:pkcs7];

}



- (NSData *)decrypt:(NSData *)plainText key:(NSData *)aSymmetricKey padding:(CCOptions *) pkcs7

{

return [self doCipher:plainText key:aSymmetricKey context:kCCDecrypt padding:pkcs7];

}



- (NSData *)doCipher:(NSData *)plainText key:(NSData *)aSymmetricKey

context:(CCOperation)encryptOrDecrypt padding:(CCOptions *)pkcs7

{



//对称加密参考。

CCCryptorRef thisEncipher = NULL;

//密码文本容器。

NSData * cipherOrPlainText = nil;

//指向输出缓冲区的指针。

uint8_t * bufferPtr = NULL;

//缓冲区的总大小。

size_t bufferPtrSize = 0;

//要执行的剩余字节数。

size_t remainingBytes = 0;

//移动到缓冲区的字节数。 br />
size_t movedBytes = 0;

// plainText缓冲区的长度。

size_t plainTextBufferSize = 0;

//总写的占位符。

size_t totalBytesWritten = 0;

//一个友好的帮助指针。

uint8_t * ptr;



//初始化向量;在这种情况下假的是0。

uint8_t iv [kChosenCipherBlockSize];

memset((void *)iv,0x0,(size_t)sizeof(iv));



plainTextBufferSize = [plainText length];







//如果我们不需要

if(encryptOrDecrypt == kCCEncrypt){

/ *
我们不想抛弃填充
if(* pkcs7!= kCCOptionECBMode){

if((plainTextBufferSize%kChosenCipherBlockSize)== 0){

* pkcs7 = 0x0000;

}其他{

* pkcs7 = kCCOptionPKCS7Padding;

}

} * /

}其他if(encryptOrDecrypt!= kCCDecrypt){



}



//创建并初始化加密引用。

CCCryptorStatus ccStatus = kCCSuccess;





ccStatus = CC CryptorCreate(encryptOrDecrypt,

kCCAlgorithmAES128,

* pkcs7,

(const void *)[aSymmetricKey bytes],

kChosenCipherKeySize,

(const void *)iv,

&thisEncipher

);





//为所有通话计算字节块对齐,包括final。

bufferPtrSize = CCCryptorGetOutputLength(thisEncipher,plainTextBufferSize,true);



//分配缓冲区。

bufferPtr = malloc(bufferPtrSize * sizeof(uint8_t));



//零输出缓冲区。

memset((void *)bufferPtr,0x0,bufferPtrSize);



//初始化一些必要的簿记。



ptr = bufferPtr;



//设置初始大小。

remainingBytes = bufferPtrSize;



//实际执行加密或解密。



ccStatus = CCCryptorUpdate(thisEncipher,

(const void *)[plainText bytes ],

plainTextBufferSize,

ptr,

remainingBytes,

&movedBytes

) ;





//处理簿记。

ptr + = movedBytes;

remainingBytes - = movedBytes;

totalBytesWritten + = movedBytes;





ccStatus = CCCryptorFinal(thisEncipher,

ptr,

remainingBytes,

&movedBytes

);



totalBytesWritten + = movedBytes;



if( thisEncipher){

(无效)CCCryptorRelease(thisEncipher);

thisEncipher = NULL;

}







if(ccStatus == kCCSuccess)

cipherOrPlainText = [NSData dataWithBytes:(const void *)bufferPtr length :(NSUInteger)totalBytesWritten];

else

cipherOrPlainText = nil;



if(bufferPtr)free( bufferPtr);



返回cipherOrPlainText;



}









@end

----------- -

#import



static char encodingTable [64] = {

'A','B' , 'C', 'd', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', N','O','P',

'Q','R','S','T','U','V','W','X' ,'Y','Z','a','b','c','d','e','f',

'g','h',' I, 'J', 'K', 'L', 'M', 'N', '0', 'p', 'q', 'R', 'S', 'T', 'U' ,'v',

'w','x','y','z','0','1','2','3','4',' 5','6','7','8','9','+','/'};



@implementation NSData(Base64)



+(NSData *)dataWithBase64EncodedString:(NSString *)string {

NSData * result = [[NSData alloc] initWithBase64EncodedString:string] ;

返回结果;

}



- (id)initWithBase64EncodedString:(NSString *)string {

NSMutableData * mutableData = nil;



if(string){

unsigned long ixtext = 0;

unsigned long lentext = 0;

unsigned char ch = 0;

unsigned char inbuf [4],outbuf [4];

short i = 0,ixinbuf = 0;

BOOL flignore = NO;

BOOL flendtext = NO;

NSData * base64Data = nil;

const unsigned char * base64Bytes = nil;



//将字符串转换为ASCII数据。

base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];

base64Bytes = [base64Data bytes];

mutableData = [NSMutableData dataWithCapacity:[base64Data length]];

lentext = [base64Data length];



while(YES){

如果(ixtext> = lentext)中断;

ch = base64Bytes [ixtext ++];

flignore = NO;



if((ch> ='A')&&(ch< ='Z'))ch = ch - 'A';

else if( (ch> ='a')&&(ch< ='z'))ch = ch - 'a'+ 26;

else if((ch> ='0') &&(ch< ='9'))ch = ch - '0'+ 52;

else if(ch =='+')ch = 62;

else if(ch =='=')flendtext = YES;

else if (ch =='/')ch = 63;

else flignore = YES;



if(!flignore){

short ctcharsinbuf = 3;

BOOL flbreak = NO;



if(flendtext){

if(!ixinbuf)break;

if((ixinbuf == 1) ||(ixinbuf == 2))ctcharsinbuf = 1;

else ctcharsinbuf = 2;

ixinbuf = 3;

flbreak = YES;

}



inbuf [ixinbuf ++] = ch;



if( ixinbuf == 4){

ixinbuf = 0;

outbuf [0] =(inbuf [0]<< 2)| ((inbuf [1]&0x30)>> 4);

outbuf [1] =((inbuf [1]&0x0F)<< 4)| ((inbuf [2]&0x3C)>> 2);

outbuf [2] =((inbuf [2]&0x03)<< 6)| (inbuf [3]&0x3F);



for(i = 0; i< ctcharsinbuf; i ++)

[mutableData appendBytes: &outbuf [i] length:1];

}



if(flbreak)break;

} < br $>
}

}



self = [self initWithData:mutableData];

返回自我;

}



- (NSString *)base64EncodingWithLineLength :( unsigned int)lineLength {

const unsigned char * bytes = [self bytes];

NSMutableString * result = [NSMutableString stringWithCapacity:[self length]];

unsigned long ixtext = 0;

unsigned long lentext = [self length];

long ctremaining = 0;

unsigned char inbuf [3],outbuf [4];

short i = 0;

短charsonline = 0,ctcopy = 0;

unsigned long ix = 0;



while(是){

ctremaining = lentext - ixtext;

if(ctrema) ining< = 0)休息;



for(i = 0;我< 3; i ++){

ix = ixtext + i;

if(ix< lentext)inbuf [i] = bytes [ix];

否则inbuf [i] = 0;

}



outbuf [0] =(inbuf [0]&0xFC)>> 2;

outbuf [1] =((inbuf [0]&0x03)<< 4)| ((inbuf [1]&0xF0)>> 4);

outbuf [2] =((inbuf [1]&0x0F)<< 2)| ((inbuf [2]&0xC0)>> 6);

outbuf [3] = inbuf [2]&0x3F;

ctcopy = 4;



开关(ctremaining){

案例1:

ctcopy = 2;

休息;

案例2:

ctcopy = 3;

休息;

}



for(i = 0; i< ctcopy; i ++)

[结果appendFormat:@%c,encodingTable [outbuf [i]]];



for(i = ctcopy; i< 4; i ++)

[结果appendFormat:@%c,'='];



ixtext + = 3;

charsonline + = 4;



if(lineLength> 0){

if(charsonline> = lineLength ){

charsonline = 0;

[结果appendString:@\ n];

}

}

}



返回结果;

}



@end


Need Implementation of AES alogorithem in c#.net, android and ios. i.e encryotion from android and decryptiopn in .net c#

解决方案

The question makes no sense. The algorithm is the same in all cases. It's the implementation could be different, depending on language. Please see:
http://en.wikipedia.org/wiki/Advanced_Encryption_Standard[^],
http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf[^].

Besides, in principle, you can use Mono on all those platform and use C# and the .NET assembly System.Security.Cryptography, or Java, using Java class javax.crypto.Cipher, also on all of these platforms. Please see:
http://msdn.microsoft.com/en-us/library/system.security.cryptography.aes%28v=vs.110%29.aspx[^],
http://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html[^].

—SA


In .Net:
------------------------------------
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Layer
{

public class Encrypt
{

public static string EncryptString(string plainSourceStringToEncrypt, string passPhrase)
{
//Set up the encryption objects
using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passPhrase)))
{
byte[] sourceBytes = Encoding.ASCII.GetBytes(plainSourceStringToEncrypt);
ICryptoTransform ictE = acsp.CreateEncryptor();

//Set up stream to contain the encryption
MemoryStream msS = new MemoryStream();

//Perform the encrpytion, storing output into the stream
CryptoStream csS = new CryptoStream(msS, ictE, CryptoStreamMode.Write);
csS.Write(sourceBytes, 0, sourceBytes.Length);

csS.FlushFinalBlock();

//sourceBytes are now encrypted as an array of secure bytes
byte[] encryptedBytes = msS.ToArray(); //.ToArray() is important, don't mess with the buffer

//return the encrypted bytes as a BASE64 encoded string
return Convert.ToBase64String(encryptedBytes);
}
}


public static string DecryptString(string base64StringToDecrypt, string passphrase)
{
//Set up the encryption objects
using (AesCryptoServiceProvider acsp = GetProvider(Encoding.Default.GetBytes(passphrase)))
{
byte[] RawBytes = Convert.FromBase64String(base64StringToDecrypt);
ICryptoTransform ictD = acsp.CreateDecryptor();

//Decrypt into stream
MemoryStream msD = new MemoryStream(RawBytes, 0, RawBytes.Length);

CryptoStream csD = new CryptoStream(msD, ictD, CryptoStreamMode.Read);
//csD now contains original byte array, fully decrypted


//return the content of msD as a regular string
return (new StreamReader(csD)).ReadToEnd();

}
}


private static AesCryptoServiceProvider GetProvider(byte[] key)
{
AesCryptoServiceProvider result = new AesCryptoServiceProvider();
result.BlockSize = 128;
result.KeySize = 128;
result.Mode = CipherMode.CBC;
result.Padding = PaddingMode.PKCS7;

result.IV = new byte[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
result.Key = key;
return result;
}


private static byte[] GetKey(byte[] suggestedKey, SymmetricAlgorithm p)
{
byte[] kRaw = suggestedKey;
List<byte> kList = new List<byte>();

for (int i = 0; i < p.LegalKeySizes[0].MinSize; i += 8)
{
kList.Add(kRaw[(i / 8) % kRaw.Length]);
}
byte[] k = kList.ToArray();
return k;
}
}
}

==============

In Xcode:
----------

#import "StringEncryption.h"
#import "NSData+Base64.h"

#if DEBUG
#define LOGGING_FACILITY(X, Y) \
NSAssert(X, Y);

#define LOGGING_FACILITY1(X, Y, Z) \
NSAssert1(X, Y, Z);
#else
#define LOGGING_FACILITY(X, Y) \
if(!(X)) { \
NSLog(Y); \
exit(-1); \
}

#define LOGGING_FACILITY1(X, Y, Z) \
if(!(X)) { \
NSLog(Y, Z); \
exit(-1); \
}
#endif

@implementation StringEncryption

NSString *_key = @"key";
CCOptions padding = kCCOptionPKCS7Padding;



+ (NSString *) EncryptString:(NSString *)plainSourceStringToEncrypt
{

StringEncryption *crypto = [[StringEncryption alloc] init];

NSData *_secretData = [plainSourceStringToEncrypt dataUsingEncoding:NSASCIIStringEncoding];

NSData *encryptedData = [crypto encrypt:_secretData key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding];

return [encryptedData base64EncodingWithLineLength:0];

}


+ (NSString *)DecryptString:(NSString *)base64StringToDecrypt
{
StringEncryption *crypto = [[StringEncryption alloc] init];
NSData *data = [crypto decrypt:[NSData dataWithBase64EncodedString:base64StringToDecrypt] key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding: &padding];
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

}


- (NSData *)encrypt:(NSData *)plainText key:(NSData *)aSymmetricKey padding:(CCOptions *)pkcs7
{
return [self doCipher:plainText key:aSymmetricKey context:kCCEncrypt padding:pkcs7];
}

- (NSData *)decrypt:(NSData *)plainText key:(NSData *)aSymmetricKey padding:(CCOptions *)pkcs7
{
return [self doCipher:plainText key:aSymmetricKey context:kCCDecrypt padding:pkcs7];
}

- (NSData *)doCipher:(NSData *)plainText key:(NSData *)aSymmetricKey
context:(CCOperation)encryptOrDecrypt padding:(CCOptions *)pkcs7
{

// Symmetric crypto reference.
CCCryptorRef thisEncipher = NULL;
// Cipher Text container.
NSData * cipherOrPlainText = nil;
// Pointer to output buffer.
uint8_t * bufferPtr = NULL;
// Total size of the buffer.
size_t bufferPtrSize = 0;
// Remaining bytes to be performed on.
size_t remainingBytes = 0;
// Number of bytes moved to buffer.
size_t movedBytes = 0;
// Length of plainText buffer.
size_t plainTextBufferSize = 0;
// Placeholder for total written.
size_t totalBytesWritten = 0;
// A friendly helper pointer.
uint8_t * ptr;

// Initialization vector; dummy in this case 0's.
uint8_t iv[kChosenCipherBlockSize];
memset((void *) iv, 0x0, (size_t) sizeof(iv));

plainTextBufferSize = [plainText length];



// We don't want to toss padding on if we don't need to
if(encryptOrDecrypt == kCCEncrypt) {
/*
if(*pkcs7 != kCCOptionECBMode) {
if((plainTextBufferSize % kChosenCipherBlockSize) == 0) {
*pkcs7 = 0x0000;
} else {
*pkcs7 = kCCOptionPKCS7Padding;
}
}*/
} else if(encryptOrDecrypt != kCCDecrypt) {

}

// Create and Initialize the crypto reference.
CCCryptorStatus ccStatus = kCCSuccess;


ccStatus = CCCryptorCreate(encryptOrDecrypt,
kCCAlgorithmAES128,
*pkcs7,
(const void *)[aSymmetricKey bytes],
kChosenCipherKeySize,
(const void *)iv,
&thisEncipher
);


// Calculate byte block alignment for all calls through to and including final.
bufferPtrSize = CCCryptorGetOutputLength(thisEncipher, plainTextBufferSize, true);

// Allocate buffer.
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t) );

// Zero out buffer.
memset((void *)bufferPtr, 0x0, bufferPtrSize);

// Initialize some necessary book keeping.

ptr = bufferPtr;

// Set up initial size.
remainingBytes = bufferPtrSize;

// Actually perform the encryption or decryption.

ccStatus = CCCryptorUpdate(thisEncipher,
(const void *) [plainText bytes],
plainTextBufferSize,
ptr,
remainingBytes,
&movedBytes
);


// Handle book keeping.
ptr += movedBytes;
remainingBytes -= movedBytes;
totalBytesWritten += movedBytes;


ccStatus = CCCryptorFinal(thisEncipher,
ptr,
remainingBytes,
&movedBytes
);

totalBytesWritten += movedBytes;

if(thisEncipher) {
(void) CCCryptorRelease(thisEncipher);
thisEncipher = NULL;
}



if (ccStatus == kCCSuccess)
cipherOrPlainText = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)totalBytesWritten];
else
cipherOrPlainText = nil;

if(bufferPtr) free(bufferPtr);

return cipherOrPlainText;

}




@end
------------
#import

static char encodingTable[64] = {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };

@implementation NSData (Base64)

+ (NSData *) dataWithBase64EncodedString:(NSString *) string {
NSData *result = [[NSData alloc] initWithBase64EncodedString:string];
return result ;
}

- (id) initWithBase64EncodedString:(NSString *) string {
NSMutableData *mutableData = nil;

if( string ) {
unsigned long ixtext = 0;
unsigned long lentext = 0;
unsigned char ch = 0;
unsigned char inbuf[4], outbuf[4];
short i = 0, ixinbuf = 0;
BOOL flignore = NO;
BOOL flendtext = NO;
NSData *base64Data = nil;
const unsigned char *base64Bytes = nil;

// Convert the string to ASCII data.
base64Data = [string dataUsingEncoding:NSASCIIStringEncoding];
base64Bytes = [base64Data bytes];
mutableData = [NSMutableData dataWithCapacity:[base64Data length]];
lentext = [base64Data length];

while( YES ) {
if( ixtext >= lentext ) break;
ch = base64Bytes[ixtext++];
flignore = NO;

if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A';
else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26;
else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52;
else if( ch == '+' ) ch = 62;
else if( ch == '=' ) flendtext = YES;
else if( ch == '/' ) ch = 63;
else flignore = YES;

if( ! flignore ) {
short ctcharsinbuf = 3;
BOOL flbreak = NO;

if( flendtext ) {
if( ! ixinbuf ) break;
if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;
else ctcharsinbuf = 2;
ixinbuf = 3;
flbreak = YES;
}

inbuf [ixinbuf++] = ch;

if( ixinbuf == 4 ) {
ixinbuf = 0;
outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 );
outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 );
outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F );

for( i = 0; i < ctcharsinbuf; i++ )
[mutableData appendBytes:&outbuf[i] length:1];
}

if( flbreak ) break;
}
}
}

self = [self initWithData:mutableData];
return self;
}

- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength {
const unsigned char *bytes = [self bytes];
NSMutableString *result = [NSMutableString stringWithCapacity:[self length]];
unsigned long ixtext = 0;
unsigned long lentext = [self length];
long ctremaining = 0;
unsigned char inbuf[3], outbuf[4];
short i = 0;
short charsonline = 0, ctcopy = 0;
unsigned long ix = 0;

while( YES ) {
ctremaining = lentext - ixtext;
if( ctremaining <= 0 ) break;

for( i = 0; i < 3; i++ ) {
ix = ixtext + i;
if( ix < lentext ) inbuf[i] = bytes[ix];
else inbuf [i] = 0;
}

outbuf [0] = (inbuf [0] & 0xFC) >> 2;
outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4);
outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6);
outbuf [3] = inbuf [2] & 0x3F;
ctcopy = 4;

switch( ctremaining ) {
case 1:
ctcopy = 2;
break;
case 2:
ctcopy = 3;
break;
}

for( i = 0; i < ctcopy; i++ )
[result appendFormat:@"%c", encodingTable[outbuf[i]]];

for( i = ctcopy; i < 4; i++ )
[result appendFormat:@"%c",'='];

ixtext += 3;
charsonline += 4;

if( lineLength > 0 ) {
if (charsonline >= lineLength) {
charsonline = 0;
[result appendString:@"\n"];
}
}
}

return result;
}

@end


这篇关于Interop AES algorithem in .Net,android Java和ios的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆