在Apex中使用ASCII及XOR Operation对QR Code Encode实例

前言】:在行文前感谢Java同事的帮助才知道如何使用ASCII!
早前我介绍过2篇关于加解密的文章,分别是apex加密与解密js加密apex解密,那么这篇我们将分享第三种场景的应用即使用ASCII与XOR位运算在apex加密中间件解密

场景描述】:
我们在使用Marketing Cloud进行Birthday Campaign相关的Email邮件营销时,一旦客户在收到的邮件中选择了需要的礼品,所选礼品券Reward Code的QR Code将会被包含在第二封邮件一齐抵达到客户终端。

这套Reward Code的分配和导入之前是由中间件和sf共同完成,那么现在需要完全由sf承担这一过程的所有工作,在Requirment Change实施的过程中,上周我收到老板邮件,说是需要使用新方案解决QR安全性的问题,即sf端对QR code的结果进行加密后再调用中间件的QR Image渲染接口实时获取二维码,然后在客户扫描后中间件进行解密。

加密模式】:

Apex对应加密解决方案】:记得使用URLENCODE处理下最终结果

String QRcode = '001999990010019600000000005061';
String KEY = 'r63yBbsaXSVCZAxxxxxxxxxxxxxJ5dKeUtcv7uRgNTP';// fake value
List<Integer> charArr = new List<Integer>();
for(Integer i = 0; i < QRcode.length(); i++) {
	charArr.add(QRcode.charAt(i)^KEY.charAt(i));	
	System.debug(QRcode.charAt(i)^KEY.charAt(i));    
}
String encodeStr = String.fromCharArray(charArr);
System.debug(encodeStr);
String result = EncodingUtil.URLENCODE(encodeStr,'UTF-8');// if you don't encode the string using the util method, that will miss some info when decode.
System.debug(result);

分析】:Bitwise operations in C | ASCII | String Class
在看到邮件时,大意知道这个是加密的方案,但是加密过程如何运算全然不知,在咨询过Java同事后,才明白了ASCII这个概念,然后知道了XOR运算法则(异或运算相同为0,不同为1),也知道了如何区ASCII表里面去对应字符串和Integer及Binary的映射关系。

在上图中QR Code/KEY字符串中每一个字符对应C列,通过C列的位置我们可以通过A列的二进制来进行位运算,然后再替换这一位置字符即可以得到encode后的密文。

Apex加密解密模板】:

public class Utility {
    // Notice: be sure you cannot pass \ character to sf.
    private static String key = Label.KEY;// max length 50
    private static Set<Integer> invalidASC = new Set<Integer>{60, 62, 42, 37, 38, 58, 92};// it means the characters "<>*%&:\"
    public static String encryptWithXOR(String originalStr, Boolean needURLEncode) {
        List<Integer> charArr = new List<Integer>();
        String encryptedStr = '';
        for(Integer i=0; i < originalStr.length(); i++) {
            Integer point = originalStr.charAt(i),
                    chas = point^key.charAt(i);

            charArr.add(invalidASC.contains(point) || invalidASC.contains(chas) ? point : chas);
        }
        encryptedStr = String.fromCharArray(charArr);
        return needURLEncode ? EncodingUtil.URLENCODE(encryptedStr,'UTF-8') : encryptedStr;
    }

    public static String decryptWithXOR(String encryptedStr, Boolean needURLDecode) {
        String data = needURLDecode ? EncodingUtil.URLDECODE(encryptedStr,'UTF-8') : encryptedStr;
        List<Integer> charArr = new List<Integer>();
        for(Integer i=0; i < data.length(); i++) {
            Integer point = data.charAt(i),
                    chas = point^key.charAt(i);

            charArr.add(invalidASC.contains(point) || invalidASC.contains(chas) ? point : chas);
        }
        return String.fromCharArray(charArr);
    }
}

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页