Interop AES algorithem in .Net,android Java和ios [英] Interop AES algorithem in .Net , android Java and ios
本文介绍了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 assemblySystem.Security.Cryptography
, or Java, using Java classjavax.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屋!
查看全文