From 751f337849230007e6f0d2f47bd7ca71066f9f02 Mon Sep 17 00:00:00 2001 From: "Liu@iMac" Date: Tue, 14 Mar 2017 18:04:16 +0800 Subject: [PATCH 01/11] fix install introduction of android in readme --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6325bf5..fd80af7 100644 --- a/README.md +++ b/README.md @@ -11,10 +11,13 @@ npm install @remobile/react-native-des --save * Look for Header Search Paths and make sure it contains both $(SRCROOT)/../../../react-native/React as recursive. ### Installation (Android) + +* In `android/settings.gradle` + ```gradle ... include ':react-native-des' -project(':react-native-des').projectDir = new File(rootProject.projectDir, '../node_modules/@remobile/react-native-des/android/RCTDes') +project(':react-native-des').projectDir = new File(rootProject.projectDir, '../node_modules/@remobile/react-native-des/android') ``` * In `android/app/build.gradle` @@ -41,7 +44,7 @@ protected List getPackages() { new RCTDesPackage(), // <------ add here ...... } - +``` ## Usage From 9307df260b086019d2db7f06b3652469b5498c64 Mon Sep 17 00:00:00 2001 From: "Liu@iMac" Date: Wed, 15 Mar 2017 10:17:46 +0800 Subject: [PATCH 02/11] add cbc encrypt & decrypt --- README.md | 3 + .../main/java/com/remobile/des/RCTDes.java | 73 ++++++++++++++++--- index.js | 2 + ios/RCTDes/RCTDes.m | 23 +++++- ios/RCTDes/lib/DesBase64.m | 27 +++++-- 5 files changed, 106 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index fd80af7..9a042d4 100644 --- a/README.md +++ b/README.md @@ -68,6 +68,9 @@ Des.encrypt("fangyunjiang is a good developer", "ABCDEFGH", function(base64) { - `encrypt(text, key, callback)` - `encrypt(base64, key, callback)` +- `encryptCbc(text, key, vec, callback)` +- `encryptCbc(base64, key, vec, callback)` + ## Server Side * see https://github.com/remobile/react-native-des/blob/master/server diff --git a/android/src/main/java/com/remobile/des/RCTDes.java b/android/src/main/java/com/remobile/des/RCTDes.java index 72a9e1d..c44f00c 100644 --- a/android/src/main/java/com/remobile/des/RCTDes.java +++ b/android/src/main/java/com/remobile/des/RCTDes.java @@ -11,6 +11,7 @@ import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; +import javax.crypto.spec.IvParameterSpec; import Decoder.BASE64Decoder; import Decoder.BASE64Encoder; @@ -25,6 +26,7 @@ public class RCTDes extends ReactContextBaseJavaModule { private final static String DES = "DES"; + private final static String DES_CBC = "DES/CBC/PKCS5Padding"; public RCTDes(ReactApplicationContext reactContext) { super(reactContext); @@ -38,7 +40,7 @@ public String getName() { @ReactMethod public void encrypt(String data, String key, Callback success, Callback error) { try { - byte[] bt = encrypt(data.getBytes(), key.getBytes()); + byte[] bt = encrypt(data.getBytes(), key.getBytes(), null); String strs = new BASE64Encoder().encode(bt); success.invoke(strs); } catch (Exception e) { @@ -51,7 +53,31 @@ public void decrypt(String data, String key, Callback success, Callback error) { try { BASE64Decoder decoder = new BASE64Decoder(); byte[] buf = decoder.decodeBuffer(data); - byte[] bt = decrypt(buf,key.getBytes()); + byte[] bt = decrypt(buf,key.getBytes(),null); + String strs = new String(bt); + success.invoke(strs); + } catch (Exception e) { + error.invoke(e.getMessage()); + } + } + + @ReactMethod + public void encryptCbc(String data, String key, String vec, Callback success, Callback error) { + try { + byte[] bt = encrypt(data.getBytes(), key.getBytes(), vec); + String strs = new BASE64Encoder().encode(bt); + success.invoke(strs); + } catch (Exception e) { + error.invoke(e.getMessage()); + } + } + + @ReactMethod + public void decryptCbc(String data, String key, String vec, Callback success, Callback error) { + try { + BASE64Decoder decoder = new BASE64Decoder(); + byte[] buf = decoder.decodeBuffer(data); + byte[] bt = decrypt(buf,key.getBytes(),vec); String strs = new String(bt); success.invoke(strs); } catch (Exception e) { @@ -63,12 +89,15 @@ public void decrypt(String data, String key, Callback success, Callback error) { * Description 根据键值进行加密 * @param data * @param key 加密键byte数组 + * @param vecStr CBC加密向量String字符串 * @return * @throws Exception */ - private static byte[] encrypt(byte[] data, byte[] key) throws Exception { + private static byte[] encrypt(byte[] data, byte[] key, String vecStr) throws Exception { // 生成一个可信任的随机数源 SecureRandom sr = new SecureRandom(); + // CBC 加密向量(只有CBC加密时用到) + IvParameterSpec iv; // 从原始密钥数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); @@ -77,11 +106,19 @@ private static byte[] encrypt(byte[] data, byte[] key) throws Exception { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); - // Cipher对象实际完成加密操作 - Cipher cipher = Cipher.getInstance(DES); - - // 用密钥初始化Cipher对象 - cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); + // Cipher对象实际完成解密操作 + Cipher cipher; + + if (vecStr != null) { + iv = new IvParameterSpec(vecStr.getBytes()); + cipher = Cipher.getInstance(DES_CBC); + // 用密钥和加密向量初始化Cipher对象 + cipher.init(Cipher.ENCRYPT_MODE, securekey, iv); + } else { + cipher = Cipher.getInstance(DES); + // 用密钥初始化Cipher对象 + cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); + } return cipher.doFinal(data); } @@ -91,12 +128,15 @@ private static byte[] encrypt(byte[] data, byte[] key) throws Exception { * Description 根据键值进行解密 * @param data * @param key 加密键byte数组 + * @param vecStr CBC加密向量String字符串 * @return * @throws Exception */ - private static byte[] decrypt(byte[] data, byte[] key) throws Exception { + private static byte[] decrypt(byte[] data, byte[] key, String vecStr) throws Exception { // 生成一个可信任的随机数源 SecureRandom sr = new SecureRandom(); + // CBC 加密向量(只有CBC解密时用到) + IvParameterSpec iv; // 从原始密钥数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); @@ -106,10 +146,19 @@ private static byte[] decrypt(byte[] data, byte[] key) throws Exception { SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 - Cipher cipher = Cipher.getInstance(DES); + Cipher cipher; + + if (vecStr != null) { + iv = new IvParameterSpec(vecStr.getBytes()); + cipher = Cipher.getInstance(DES_CBC); + // 用密钥和加密向量初始化Cipher对象 + cipher.init(Cipher.DECRYPT_MODE, securekey, iv); + } else { + cipher = Cipher.getInstance(DES); + // 用密钥初始化Cipher对象 + cipher.init(Cipher.DECRYPT_MODE, securekey, sr); + } - // 用密钥初始化Cipher对象 - cipher.init(Cipher.DECRYPT_MODE, securekey, sr); return cipher.doFinal(data); } diff --git a/index.js b/index.js index 0816e8b..ef964fa 100644 --- a/index.js +++ b/index.js @@ -9,4 +9,6 @@ var { module.exports = ENABLE ? NativeModules.Des : { encrypt: (text, key, callback)=>callback(text), decrypt: (code, key, callback)=>callback(code), + encryptCbc: (text, key, vec, callback)=>callback(text), + decryptCbc: (code, key, vec, callback)=>callback(code), }; diff --git a/ios/RCTDes/RCTDes.m b/ios/RCTDes/RCTDes.m index 41e0c93..039fefa 100644 --- a/ios/RCTDes/RCTDes.m +++ b/ios/RCTDes/RCTDes.m @@ -14,7 +14,7 @@ @implementation RCTDes RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(encrypt:(NSString *)data key:(NSString *)key success:(RCTResponseSenderBlock)success error:(RCTResponseSenderBlock)error) { - NSString *base64 = [DesBase64 encryptUseDES:data key:key]; + NSString *base64 = [DesBase64 encryptUseDES:data key:key vec:nil]; if (base64 == nil) { error(@[]); } else { @@ -23,11 +23,30 @@ @implementation RCTDes } RCT_EXPORT_METHOD(decrypt:(NSString *)base64 key:(NSString *)key success:(RCTResponseSenderBlock)success error:(RCTResponseSenderBlock)error) { - NSString *data = [DesBase64 decryptUseDES:base64 key:key]; + NSString *data = [DesBase64 decryptUseDES:base64 key:key vec:nil]; if (data == nil) { error(@[]); } else { success(@[data]); } } + +RCT_EXPORT_METHOD(encryptCbc:(NSString *)data key:(NSString *)key vec:(NSString *)vec success:(RCTResponseSenderBlock)success error:(RCTResponseSenderBlock)error) { + NSString *base64 = [DesBase64 encryptUseDES:data key:key vec:vec]; + if (base64 == nil) { + error(@[]); + } else { + success(@[base64]); + } +} + +RCT_EXPORT_METHOD(decryptCbc:(NSString *)base64 key:(NSString *)key vec:(NSString *)vec success:(RCTResponseSenderBlock)success error:(RCTResponseSenderBlock)error) { + NSString *data = [DesBase64 decryptUseDES:base64 key:key vec:vec]; + if (data == nil) { + error(@[]); + } else { + success(@[data]); + } +} + @end diff --git a/ios/RCTDes/lib/DesBase64.m b/ios/RCTDes/lib/DesBase64.m index 7598d3f..53e6b10 100644 --- a/ios/RCTDes/lib/DesBase64.m +++ b/ios/RCTDes/lib/DesBase64.m @@ -12,20 +12,26 @@ @implementation DesBase64 -+ (NSString *)encryptUseDES:(NSString *)clearText key:(NSString *)key ++ (NSString *)encryptUseDES:(NSString *)clearText key:(NSString *)key vec:(NSString*)vec { NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; NSUInteger dataLength = [data length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = calloc(bufferSize, sizeof(char)); size_t numBytesEncrypted = 0; + CCOptions ccOp = kCCOptionPKCS7Padding | kCCOptionECBMode; + void *iv = nil; + if (vec) { + iv = (void *)[vec UTF8String]; + ccOp = kCCOptionPKCS7Padding; + } CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, - kCCOptionPKCS7Padding | kCCOptionECBMode, + ccOp, [key UTF8String], kCCKeySizeDES, - nil, + iv, [data bytes], dataLength, buffer, @@ -43,21 +49,26 @@ + (NSString *)encryptUseDES:(NSString *)clearText key:(NSString *)key return plainText; } -+ (NSString*)decryptUseDES:(NSString*)cipherText key:(NSString*)key { ++ (NSString*)decryptUseDES:(NSString*)cipherText key:(NSString*)key vec:(NSString*)vec { // 利用 GTMBase64 解碼 Base64 字串 NSData* cipherData = [GTMBase64 decodeString:cipherText]; NSUInteger dataLength = [cipherData length]; size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = calloc(bufferSize, sizeof(char)); size_t numBytesDecrypted = 0; - - // IV 偏移量不需使用 + CCOptions ccOp = kCCOptionPKCS7Padding | kCCOptionECBMode; + void *iv = nil; + if (vec) { + iv = (void *)[vec UTF8String]; + ccOp = kCCOptionPKCS7Padding; + } + CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, - kCCOptionPKCS7Padding | kCCOptionECBMode, + ccOp, [key UTF8String], kCCKeySizeDES, - nil, + iv, [cipherData bytes], dataLength, buffer, From fdf4a66fca500f690a1ce9ce1f1e96328430b34e Mon Sep 17 00:00:00 2001 From: "Liu@iMac" Date: Wed, 15 Mar 2017 11:12:50 +0800 Subject: [PATCH 03/11] fix DesBase64 header declare --- ios/RCTDes/lib/DesBase64.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/RCTDes/lib/DesBase64.h b/ios/RCTDes/lib/DesBase64.h index 1957e35..3e7daf0 100644 --- a/ios/RCTDes/lib/DesBase64.h +++ b/ios/RCTDes/lib/DesBase64.h @@ -9,7 +9,7 @@ #import @interface DesBase64 : NSObject -+ (NSString *)encryptUseDES:(NSString *)clearText key:(NSString *)key; -+ (NSString*)decryptUseDES:(NSString*)cipherText key:(NSString*)key; ++ (NSString *)encryptUseDES:(NSString *)clearText key:(NSString *)key vec:(NSString *)vec; ++ (NSString*)decryptUseDES:(NSString*)cipherText key:(NSString*)key vec:(NSString *)vec; @end From f1fe43700a4e79c3b740463bdc9fc6d91cb1c805 Mon Sep 17 00:00:00 2001 From: "Liu@iMac" Date: Wed, 15 Mar 2017 14:43:02 +0800 Subject: [PATCH 04/11] fix README --- README.md | 58 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 9a042d4..72eb0bd 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,54 @@ # React Native Des (remobile) A des crypto for react-native +> fork from remobile/react-native-des +> only add cbc feature in Android and iOS + ## Installation ```sh -npm install @remobile/react-native-des --save +npm install react-native-des-cbc --save ``` + ### Installation (iOS) -* Drag RCTDes.xcodeproj to your project on Xcode. -* Click on your main project file (the one that represents the .xcodeproj) select Build Phases and drag libRCTDes.a from the Products folder inside the RCTDes.xcodeproj. -* Look for Header Search Paths and make sure it contains both $(SRCROOT)/../../../react-native/React as recursive. +1. Drag `node_modules/react-native-des-cbc/ios/RCTDes.xcodeproj` to your project's `Libraries` in Xcode. +2. Click on your main project and select `Build Phases` then drag `libRCTDes.a` from the `Libraries/RCTDes.xcodeproj/Products` into `Link Binary With Libraries`. +3. (Optional) Look for `Build Settings/Header Search Paths` and make sure it contains both `$(SRCROOT)/../../../react-native/React` as recursive. +4. `command + b` to buil it. ### Installation (Android) -* In `android/settings.gradle` +1/3. In `android/settings.gradle` ```gradle -... -include ':react-native-des' -project(':react-native-des').projectDir = new File(rootProject.projectDir, '../node_modules/@remobile/react-native-des/android') +//... +include ':react-native-des-cbc' +project(':react-native-des-cbc').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-des-cbc/android') ``` -* In `android/app/build.gradle` +2/3. In `android/app/build.gradle` ```gradle -... +//... dependencies { - ... - compile project(':react-native-des') + //... + compile project(':react-native-des-cbc') } ``` -* register module (in MainApplication.java) +3/3. register module (in `MainApplication.java`) ```java -...... +//...... import com.remobile.des.RCTDesPackage; // <--- import - -...... +//...... @Override protected List getPackages() { - ...... - new RCTDesPackage(), // <------ add here - ...... + return Arrays.asList( + //...... + new RCTDesPackage(), // <------ add here + //...... + ); } ``` @@ -50,7 +56,7 @@ protected List getPackages() { ### Example ```js -var Des = require('@remobile/react-native-des'); +var Des = require('react-native-des-cbc'); Des.encrypt("fangyunjiang is a good developer", "ABCDEFGH", function(base64) { console.log(base64); //wWcr2BJdyldTHn4z3AxA0qBIdHQkIKmpqhTgNuRd3fAFXzvIO5347g== @@ -62,6 +68,18 @@ Des.encrypt("fangyunjiang is a good developer", "ABCDEFGH", function(base64) { }, function() { console.log("error"); }); + +var vec = "cute"; +Des.encryptCbc("PizzaLiu is a good developer too", "ABCDEFGH", vec, function(base64) { + console.log(base64); + Des.decryptCbc(base64, "ABCDEFGH", vec, function(text) { + console.log(text); //PizzaLiu is a good developer + }, function(){ + console.log("error"); + }); +}, function() { + console.log("error"); +}); ``` ### method From d96911923174a744ef3af97f09d64913f1b1dcd3 Mon Sep 17 00:00:00 2001 From: "Liu@iMac" Date: Wed, 15 Mar 2017 14:43:41 +0800 Subject: [PATCH 05/11] update version --- package.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index d99dd32..6cb1ed2 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,10 @@ { - "name": "@remobile/react-native-des", - "version": "1.0.4", + "name": "react-native-des-cbc", + "version": "1.0.6", "description": "A des crypto for react-native", "main": "index.js", "author": { - "name": "YunJiang.Fang", + "name": "YunJiang.Fang & PizzaLiu", "email": "42550564@qq.com" }, "license": "MIT", @@ -16,14 +16,15 @@ "des", "crypto", "remobile", - "mobile" + "mobile", + "pizzaliu" ], - "homepage": "https://github.com/remobile/react-native-des", + "homepage": "https://github.com/PizzaLiu/react-native-des", "bugs": { - "url": "https://github.com/remobile/react-native-des/issues" + "url": "https://github.com/PizzaLiu/react-native-des/issues" }, "repository": { "type": "git", - "url": "git://github.com/remobile/react-native-des.git" + "url": "git://github.com/PizzaLiu/react-native-des.git" } } From 0ee822a3888e9a4877547b75da2638937237cba3 Mon Sep 17 00:00:00 2001 From: PizzaLiu Date: Mon, 5 Nov 2018 18:49:45 +0800 Subject: [PATCH 06/11] fix for new version RN --- android/src/main/java/com/remobile/des/RCTDesPackage.java | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/remobile/des/RCTDesPackage.java b/android/src/main/java/com/remobile/des/RCTDesPackage.java index 1ed6b05..89ecc0a 100644 --- a/android/src/main/java/com/remobile/des/RCTDesPackage.java +++ b/android/src/main/java/com/remobile/des/RCTDesPackage.java @@ -20,7 +20,7 @@ public List createNativeModules(ReactApplicationContext reactConte ); } - @Override + //@Override public List> createJSModules() { return Collections.emptyList(); } diff --git a/package.json b/package.json index 6cb1ed2..1d8c7f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-des-cbc", - "version": "1.0.6", + "version": "1.0.7", "description": "A des crypto for react-native", "main": "index.js", "author": { From bd916d78d41aaa623621a147e1016522bb8b5e06 Mon Sep 17 00:00:00 2001 From: PizzaLiu Date: Mon, 24 Feb 2020 21:52:00 +0800 Subject: [PATCH 07/11] add podspec --- react-native-des-cbc.podspec | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 react-native-des-cbc.podspec diff --git a/react-native-des-cbc.podspec b/react-native-des-cbc.podspec new file mode 100644 index 0000000..0e49b14 --- /dev/null +++ b/react-native-des-cbc.podspec @@ -0,0 +1,18 @@ +require 'json' + +package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) + +Pod::Spec.new do |s| + s.name = package['name'] + s.version = package['version'] + s.summary = package['description'] + s.license = package['license'] + + s.authors = package['author'] + s.homepage = package['homepage'] + s.platform = :ios, "9.0" + + s.source = { :git => "https://github.com/pizzaliu/react-native-des-cbc.git", :tag => "v#{s.version}" } + s.source_files = "ios/**/*.{h,m}" + s.dependency "React" +end \ No newline at end of file From bee85c3dd312563d22dda432d87d0afca454d560 Mon Sep 17 00:00:00 2001 From: PizzaLiu Date: Mon, 24 Feb 2020 21:58:34 +0800 Subject: [PATCH 08/11] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d8c7f7..51d2095 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-des-cbc", - "version": "1.0.7", + "version": "1.0.8", "description": "A des crypto for react-native", "main": "index.js", "author": { From b1e0da64f5a82de03dc4362611717a0f86f53426 Mon Sep 17 00:00:00 2001 From: PizzaLiu Date: Wed, 26 Feb 2020 20:09:08 +0800 Subject: [PATCH 09/11] update build.gradle --- android/build.gradle | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/android/build.gradle b/android/build.gradle index f869ea9..4bcfa5d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,6 @@ apply plugin: 'com.android.library' android { compileSdkVersion 23 - buildToolsVersion "23.0.1" defaultConfig { minSdkVersion 16 @@ -19,7 +18,7 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:23.0.1' - compile 'com.facebook.react:react-native:+' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:23.0.1' + implementation 'com.facebook.react:react-native:+' } From 8c3ea63bf12427ab6f4b4378d7e84c5c109f4867 Mon Sep 17 00:00:00 2001 From: PizzaLiu Date: Wed, 26 Feb 2020 20:12:40 +0800 Subject: [PATCH 10/11] bump version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 51d2095..a59bd79 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-des-cbc", - "version": "1.0.8", + "version": "1.0.9", "description": "A des crypto for react-native", "main": "index.js", "author": { From 56968496652bb6e6ee437138f6bc858ecf266f67 Mon Sep 17 00:00:00 2001 From: pizzaliu Date: Fri, 1 Mar 2024 23:06:57 +0800 Subject: [PATCH 11/11] tea validate --- tea.yaml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 tea.yaml diff --git a/tea.yaml b/tea.yaml new file mode 100644 index 0000000..ee56a76 --- /dev/null +++ b/tea.yaml @@ -0,0 +1,6 @@ +# https://tea.xyz/what-is-this-file +--- +version: 1.0.0 +codeOwners: + - '0xBf6931249a289286Ab012634C0A964813131bA5f' +quorum: 1