加密算法

在工作中曹洽,難免與其他公司進(jìn)行合作開發(fā)瓤檐,當(dāng)遇到不熟悉的語言,需要按照對方的要求進(jìn)行加密而且沒有demo的時(shí)候排截,就比較麻煩嫌蚤。
這個(gè)文檔主要記錄用過的幾個(gè)加密算法辐益,并且增加不同語言間的對應(yīng)轉(zhuǎn)換,便于日后參考脱吱。

由于很多java代碼當(dāng)時(shí)使用線上的環(huán)境進(jìn)行運(yùn)行和測試的智政,所以有些inlcude文件沒有記錄下來,這樣在直接使用的時(shí)候會(huì)造成一些不便箱蝠,而且使用ruby時(shí)間長了以后续捂,很少有引用包、庫宦搬、頭文件的習(xí)慣牙瓢,所以,在運(yùn)行時(shí)间校,可以根據(jù)錯(cuò)誤提示一罩,添加相應(yīng)的包。

AES-128-CBC加密

我常用的語言是ruby撇簿,以下是ruby版本加密
具體的內(nèi)容可參考ruby官方網(wǎng)文檔OpenSSL::Cipher

KEY = "08AB199416B82178"
IV = "0102030405060708"
def self.aes_base64_encrypt(message, key, alg = 'AES-128-CBC')
  cipher = OpenSSL::Cipher.new(alg)
  cipher.encrypt
  cipher.key = key
  cipher.iv = IV
  encrypted = cipher.update(message) + cipher.final
  Base64.strict_encode64(encrypted)
end

def self.aes_base64_decrypt(message, key, alg = 'AES-128-CBC')
  message = Base64.decode64(message)
  decipher = OpenSSL::Cipher.new(alg)
  decipher.decrypt
  decipher.key = key
  decipher.iv = IV
  plain = decipher.update(message) + decipher.final
end

然后是對應(yīng)的java版本的代碼

// java
// AES-128-CBC加密的算法java版本找不到了,隨后補(bǔ)上

當(dāng)時(shí)找java對應(yīng)的代碼的時(shí)候碰巧找到了一個(gè).NET版的差购,索性也保存了下來

// .NET
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

public class Program
{
    private const string AesIV = @"0102030405060708";
    private const string AesKey = @"08AB199416B82178";

    public static void Main()
    {
        Console.WriteLine("Hello World");
        string str1 = Encrypt("hello world");
        Console.WriteLine(str1);
        string str2 = Decrypt(str1);
        Console.WriteLine(str2);
    }

    public static string Encrypt(string text)
    {
        // AesCryptoServiceProvider
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.BlockSize = 128;
        aes.KeySize = 128;
        aes.IV = Encoding.UTF8.GetBytes(AesIV);
        aes.Key = Encoding.UTF8.GetBytes(AesKey);
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;

        // Convert string to byte array
        byte[] src = Encoding.UTF8.GetBytes(text);

        // encryption
        using (ICryptoTransform encrypt = aes.CreateEncryptor())
        {
            byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);

            // Convert byte array to Base64 strings
            return Convert.ToBase64String(dest);
        }
    }

    public static string Decrypt(string text)
    {
        // AesCryptoServiceProvider
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.BlockSize = 128;
        aes.KeySize = 128;
        aes.IV = Encoding.UTF8.GetBytes(AesIV);
        aes.Key = Encoding.UTF8.GetBytes(AesKey);
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;

        // Convert Base64 strings to byte array
        byte[] src = System.Convert.FromBase64String(text);

        // decryption
        using (ICryptoTransform decrypt = aes.CreateDecryptor())
        {
            byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
            return Encoding.UTF8.GetString(dest);
        }
    }
}

AES-128-ECB加密

# ruby
def self.aes_base64_encrypt(message, key, alg = 'AES-128-ECB')
  cipher = OpenSSL::Cipher.new(alg)
  cipher.encrypt
  cipher.key = key
  encrypted = cipher.update(message) + cipher.final
  Base64.strict_encode64(encrypted)
end

def self.aes_base64_decrypt(message, key, alg = 'AES-128-ECB')
  message = Base64.decode64(message)
  decipher = OpenSSL::Cipher.new(alg)
  decipher.decrypt
  decipher.key = key
  plain = decipher.update(message) + decipher.final
end
// java
public static byte[] encrypt(byte[] byteS, String pwd) throws Exception {
  byte[] byteFina = null;
  Cipher cipher;
  try {
    cipher = Cipher.getInstance("AES");

    SecretKeySpec keySpec = new SecretKeySpec(getKey(pwd), "AES");

    cipher.init(Cipher.ENCRYPT_MODE, keySpec);
    byteFina = cipher.doFinal(byteS);
  } catch (Exception e) {
    throw e;
  } finally {
    cipher = null;
  }

  return byteFina;
}

SHA1加密

#ruby
Digest::SHA1.hexdigest("hello wolrd")
// java
import java.security.*;
import java.io.*;
import java.util.Formatter;

public class HelloWorld{
     public static void main(String []args){
        String password = "hello world";
        String sha1 = "";

        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(password.getBytes("UTF-8"));
            sha1 = byteToHex(crypt.digest());
        } catch(NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch(UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        System.out.println(sha1);
     }

    public static String byteToHex(final byte[] hash)
    {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }
}

RSA加密 & 公鑰簽名(SHA256withRSA)

# ruby
require 'openssl'

def self.get_rsa_key(key, key_size = 1024)
  if key
    rsa = OpenSSL::PKey::RSA.new(key)
  else
    rsa = OpenSSL::PKey::RSA.new(key_size)
  end

  [rsa.public_key.to_pem , rsa.to_pem]
end

def self.rsa_private_encrypt(message , rsa_key)
    rsa = OpenSSL::PKey::RSA.new(rsa_key)
    rsa.private_encrypt(message)
end

def self.rsa_private_decrypt(message , rsa_key)
    rsa = OpenSSL::PKey::RSA.new(rsa_key)
    rsa.private_decrypt(message)
end

def self.rsa_public_encrypt(message , public_key)
    rsa = OpenSSL::PKey::RSA.new(public_key)
    rsa.public_encrypt(message)
end

def self.rsa_public_decrypt(message , public_key)
   rsa = OpenSSL::PKey::RSA.new(public_key)
   rsa.public_decrypt(message)
end

def self.rsa_SHA256_sign(message, rsa_key)
  digest = OpenSSL::Digest::SHA256.new
  rsa = OpenSSL::PKey::RSA.new(rsa_key)

  signature = rsa.sign(digest, message)

  if rsa.public_key.verify(digest, signature, message)
    signature
  else
    nil
  end
end
// java
public static byte[] encryptData(byte[] source,PublicKey publickey) throws Exception {
    Cipher cipher;
    byte[]output ;
    ByteArrayOutputStream out = new ByteArrayOutputStream();

    try {
        cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publickey); 

        int inputLen = source.length;
        int offSet   = 0;
        int i = 0;
        byte[] cache;
        while (inputLen - offSet > 0) {
            if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
                cache = cipher.doFinal(source, offSet, MAX_ENCRYPT_BLOCK);
            } else {
                cache = cipher.doFinal(source, offSet, inputLen - offSet);
            }
            out.write(cache, 0, cache.length);
            i++;
            offSet = i * MAX_ENCRYPT_BLOCK;
        }
        output = out.toByteArray();
    }
    catch(Exception e) {
        throw e;
    } finally {
        out.close();
    }
    return output;
}

public static  byte[] signature(byte[] signedContentStr,PrivateKey privateKey)throws Exception {
  Signature sig;
  byte[] ret = null ;

  sig = Signature.getInstance("SHA256withRSA");
  sig.initSign(privateKey);

  sig.update(signedContentStr);
  ret = (sig.sign());

  return ret;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末四瘫,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欲逃,更是在濱河造成了極大的恐慌找蜜,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稳析,死亡現(xiàn)場離奇詭異洗做,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)彰居,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進(jìn)店門诚纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人陈惰,你說我怎么就攤上這事畦徘。” “怎么了抬闯?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵井辆,是天一觀的道長。 經(jīng)常有香客問我溶握,道長杯缺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任睡榆,我火速辦了婚禮萍肆,結(jié)果婚禮上袍榆,老公的妹妹穿的比我還像新娘。我一直安慰自己匾鸥,他們只是感情好蜡塌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勿负,像睡著了一般馏艾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奴愉,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天琅摩,我揣著相機(jī)與錄音,去河邊找鬼锭硼。 笑死房资,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的檀头。 我是一名探鬼主播轰异,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼暑始!你這毒婦竟也來了搭独?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤廊镜,失蹤者是張志新(化名)和其女友劉穎牙肝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗤朴,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡配椭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雹姊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片股缸。...
    茶點(diǎn)故事閱讀 40,498評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吱雏,靈堂內(nèi)的尸體忽然破棺而出乓序,到底是詐尸還是另有隱情,我是刑警寧澤坎背,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布替劈,位于F島的核電站,受9級特大地震影響得滤,放射性物質(zhì)發(fā)生泄漏陨献。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一懂更、第九天 我趴在偏房一處隱蔽的房頂上張望眨业。 院中可真熱鬧急膀,春花似錦、人聲如沸龄捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽聘殖。三九已至晨雳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奸腺,已是汗流浹背餐禁。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留突照,地道東北人帮非。 一個(gè)月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像讹蘑,于是被迫代替她去往敵國和親末盔。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 概述 之前一直對加密相關(guān)的算法知之甚少座慰,只知道類似DES庄岖、RSA等加密算法能對數(shù)據(jù)傳輸進(jìn)行加密,且各種加密算法各有...
    Henryzhu閱讀 3,023評論 0 14
  • 在開發(fā)應(yīng)用過程中角骤,客戶端與服務(wù)端經(jīng)常需要進(jìn)行數(shù)據(jù)傳輸,涉及到重要隱私安全信息時(shí)心剥,開發(fā)者自然會(huì)想到對其進(jìn)行加密邦尊,即使...
    閑庭閱讀 3,275評論 0 11
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開發(fā)過程中,在網(wǎng)絡(luò)通信优烧、數(shù)據(jù)存儲蝉揍、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹閱讀 2,472評論 0 6
  • 在項(xiàng)目開發(fā)過程中,當(dāng)我們利用數(shù)據(jù)庫存儲一些關(guān)于用戶的隱私信息畦娄,諸如密碼又沾、帳戶密鑰等數(shù)據(jù)時(shí),需要加密后才向數(shù)據(jù)庫寫入...
    witchiman閱讀 2,693評論 0 0
  • 前段時(shí)間開發(fā)中用到了加密滑燃,就趁這個(gè)機(jī)會(huì)查閱了一些相關(guān)的資料,對解密加深了一些印象颓鲜,以下是我的一些總結(jié)表窘。 消息摘要算...
    肚子總是餓閱讀 3,333評論 0 21