JavaIOS通用异或加解密字符串

it2026-02-10  15

1、Java的异或加解密算法

在使用异或加解密时,加密和解密的密钥必须保持相同,否则解密时无法恢复为原来的内容。

 [java] 

public class XOREncryptAndDecrypt {            //密钥 加解密的密钥必须相同 可自定义      private static final String secretKey ="abcdefghijklmnopqrstuvwxyz";             /**      * 字符串加密      * @param plainText 要加密的字符串      * @return 加密后的字符串      */      public static String encrypt(String plainText){           String encryption = "";           try {               plainText =  new String(plainText.getBytes("UTF-8"),"iso-8859-1");              } catch (Exception e) {              }           char[] cipher=new char[plainText.length()];           for(int i=0,j=0;i<plainText.length();i++,j++){               if(j==secretKey.length())                   j=0;               cipher[i]=(char) (plainText.charAt(i)^secretKey.charAt(j));               String strCipher= Integer.toHexString(cipher[i]);               if(strCipher.length() == 1){                   encryption+="0"+strCipher;               }else{                   encryption+=strCipher;               }           }           return encryption;       }        /**      * 解密字符串      * @param encryption 要解密的字符串      * @return 解密后的字符串      */      public static String decrypt(String encryption) {           char[] decryption=new char[encryption.length()/2];           for(int i=0,j=0;i<encryption.length()/2;i++,j++){               if(j==secretKey.length())                   j=0;               char n=(char)(int)Integer.valueOf(encryption.substring(i*2,i*2+2),16);               decryption[i]=(char)(n^secretKey.charAt(j));           }           String decoding="";           try {               decoding = new String(String.valueOf(decryption).getBytes("iso-8859-1"),"UTF-8");                  } catch (Exception e) {              }           return decoding;       }        /**      * @param args      */      public static void main(String[] args) {          String name="你好";           String tem=XOREncryptAndDecrypt.encrypt(name);           System.out.println(tem);           System.out.println(XOREncryptAndDecrypt.decrypt(tem));        }    }  

2、IOS加解密算法

 在使用异或加解密时,加密和解密的密钥必须保持相同,否则解密时无法恢复为原来的内容。如果想在iOS与Java中通用,必须保持Java与IOS中的密钥一致。

1).h文件内容

 [objc] 

#import <Foundation/Foundation.h>    @interface XOREncryptAndDecrypt : NSObject    /**  *  字符串加密  *  *  @param plainText 要加密的字符串  *  *  @return 加密后的字符串  */  + (NSString *)encryptForPlainText:(NSString *)plainText;    /**  *  解密字符串  *  *  @param encryption 要解密的字符串  *  *  @return 要解密的字符串 如果不为加密字符则返回原字符串  */  + (NSString *)decryptForEncryption:(NSString *)encryption;    @end  

2).m文件内容

 [objc] 

#import "XOREncryptAndDecrypt.h"  @implementation XOREncryptAndDecrypt  static NSString *secretKey =@"abcdefghijklmnopqrstuvwxyz"; ///<密钥 加解密的密钥必须相同 可自定义  #pragma mark 加密字符串  + (NSString *)encryptForPlainText:(NSString *)plainText  {  //保存加密后的字符  NSMutableString *encryption=[NSMutableString string];  //编码转换后的字符串 UTF_8->iso-8859-1  NSString *encoding=[[NSString alloc]initWithData:[plainText dataUsingEncoding:NSUTF8StringEncoding] encoding:NSISOLatin1StringEncoding];  for(int i=0,j=0;i<encoding.length;i++,j++){  if(j==secretKey.length){              j=0;          }  //异或后的字符  char cipher=(char)([encoding characterAtIndex:i]^[secretKey characterAtIndex:j]);  //NSLog(@"%c转成16进制的字符串:%@,%@",cipher,[NSString stringWithFormat:@"%hhx",cipher],[NSString stringWithFormat:@"%x",cipher&0xff]);  //转成16进制形式的字符串 \x8b转成8b字符串  NSString *strCipher= [NSString stringWithFormat:@"%hhx",cipher];  if(strCipher.length == 1){              [encryption appendFormat:@"0%@",strCipher];          }else{              [encryption appendString:strCipher];          }      }  return encryption;  }  #pragma mark 解密 如果不为加密字符则返回原字符  + (NSString *)decryptForEncryption:(NSString *)encryption {  //保存解密后的字符  NSMutableString *decryption=[NSMutableString string];  //解码字符  NSString *decoding=nil;  for(int i=0,j=0;i<encryption.length/2;i++,j++){  if(j==secretKey.length){              j=0;          }  //截取16进制形式的字符串 \x8b中的8b  NSString *tem=[encryption substringWithRange:NSMakeRange(i*2, 2)];  char  *endptr;  //把16进制形式的字符串转为字符  char n=(char)(int)strtoul([tem UTF8String],&endptr,16);  //判断是否为加密字符  if (n=='\0'&&*endptr!='\0') {              [decryption setString:@""];  break;          }          [decryption appendFormat:@"%c",(char)(n^[secretKey characterAtIndex:j])];      }  if (![decryption isEqualToString:@""]) {  //编码后的字符串 iso-8859-1 -> UTF_8          decoding=[[NSString alloc]initWithData:[[decryption copy] dataUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];      }  if (decoding==nil) {          decoding=encryption;      }  return decoding;  }  @end  

转载于:https://www.cnblogs.com/akiha/p/6507011.html

最新回复(0)