Skip to main content

附錄


1.AES256加解密

說明

  • 此系統傳遞之Aes256加解密,以檢核碼系統取得的Key值(EncryptionKey)及IV值(EncryptionIV)做加解密

Code Example

C# version

private string AES256_Encrypt(string Content, string Key, string IV)
{
byte[] byteString = Encoding.UTF8.GetBytes(Content);
byte[] IVArray = Encoding.UTF8.GetBytes(IV);
byte[] ToEncryptArray = Encoding.UTF8.GetBytes(ToEncrypt);
RijndaelManaged rDel = new RijndaelManaged
{
Key = KeyArray,
IV = IVArray,
Mode = CipherMode.CBC,
Padding = PaddingMode.Zeros
};
ICryptoTransform cTransform = rDel.CreateEncryptor();

byte[] ResultArray = cTransform.TransformFinalBlock(ToEncryptArray, 0, ToEncryptArray.Length);

return Convert.ToBase64String(ResultArray, 0, ResultArray.Length);
}

private string AES256_Decrypt(string Content, string Key, string IV)
{
byte[] KeyArray = Encoding.UTF8.GetBytes(Key);
byte[] IVArray = Encoding.UTF8.GetBytes(IV);
byte[] ToEncryptArray = Convert.FromBase64String(ToDecrypt);

RijndaelManaged rDel = new RijndaelManaged
{
Key = KeyArray,
IV = IVArray,
Mode = CipherMode.CBC,
Padding = PaddingMode.Zeros
};
ICryptoTransform cTransform = rDel.CreateDecryptor();

byte[] ResultArray = cTransform.TransformFinalBlock(ToEncryptArray, 0, ToEncryptArray.Length);

return StrReplace(Encoding.UTF8.GetString(ResultArray), "\0", "");
}

2.TimeStr時間戳格式

說明

以日期 2019-11-24 00:50:18產生10碼數字

第1至4碼:太陽日,第1碼取西元年最後一位 2019 = 9

2至4碼為一整年的起算天數,11/24為今年的328天,所以2至4碼 = 328

第5至10碼:5-6為小時數字 = 00;7-8為分鐘數字 = 50;9-10為秒分數字 = 18

1至10碼組成時間戳 TimeStr = 9328005018

Code Example

//西元年最後一碼1位+太陽日數3位+小時數2位+分鐘數2位+秒數2位,共10位數

string TimeStr = StrRight(DateTime.Now.Year.ToString(), 1) +
DateTime.Now.DayOfYear.ToString() +
StrRight("0" + DateTime.Now.Hour.ToString(), 2) +
StrRight("0" + DateTime.Now.Minute.ToString(), 2) +
StrRight("0" + DateTime.Now.Second.ToString(), 2);

return TimeStr;

3.加權檢核碼生產規則

說明

分別以加權權數(23碼)與加權基數(23碼)各個數字相乘之後取個位數字,再取得以10減去個數字相加後除以10得餘數後的數字獲得加權權數檢查碼1碼 (10-餘數) 若為10則取0;之後將加權權數前15碼字串與加權權數檢查碼1碼串接取得16碼數字

Ex:

OP = GP

商家帳號(mem_cid) = 028229955,TimeStr = 9328005018

加權基數(23碼):93193193193193193193193(固定值)

加權權數(23碼):商家帳號9碼,不足左補0;

取商家帳號前5碼(5碼) = 02822 +

TimeStr(10碼) = 9328005018 +

TimeStr前4碼(4碼) = 9328 +

商家帳號後4碼(4碼) = 9955

加權權數(23碼) = 029955932800501893280282

將權數與基數相乘取其個位數字相加

加權算法

取個數分別得到並相加:

8 + 7 + 9 + 5 + 5 + 9 + 7 + 6 + 8 +0 + 0 + 5 + 0 + 3 + 8 + 1 + 9 + 2 + 2 + 0 + 2 + 2 + 6 = 104

104 / 10得餘數 4 :加權檢查碼 取 10 – 4 = 6

加權檢核碼 = 0282293280050186

Code Example

//OP = GP

int intPN = 0;
int intCN = 0;
string PowerNum = "93193193193193193193193"; //加權數值
string BaseNum = ""; //加權基數
string CheckString = ""; //隨機檢查碼
string webno = mem_cid; //商家帳號

//判斷身分證取右邊9碼
if (Check_TW(mem_cid)) { webno = StrRight(mem_cid, 9); }

//判斷統編左補0
if (ValidBID(mem_cid)) { webno = StrRight("0" + mem_cid, 9); }

//取帳號的左邊5碼與時間戳字串合併
CheckString = StrLeft(webno, 5) + TimeStr;

//設定加權基數 取得時間戳左4碼與帳號右四碼合併,並串接於CheckString 右側
BaseNum = CheckString + StrLeft(TimeStr, 4) + StrRight(webno, 4);

//計算並取得隨機檢查碼
for (int i = 0; i <= 22; i++)
{
intPN = Convert.ToInt16(BaseNum.Substring(i, 1));
intCN = Convert.ToInt16(PowerNum.Substring(i, 1));
CheckNum += Convert.ToInt32(StrRight(Convert.ToString(intPN * intCN), 1));
}

//10與 隨機碼取10的餘數相減-若為10則取0
CheckNum = 10 - (CheckNum % 10);
CheckString += StrRight("0" + Convert.ToString(CheckNum), 1);

return CheckString;

※ 組成回覆PassCode時的加權檢核碼會以GK的規則替換


OP = GK

Ex:

商家帳號(mem_cid) = 028229955,TimeStr = 9328005018

加權基數(23碼):93193193193193193193193(固定值)

加權權數(23碼):商家帳號9碼,不足左補0;

取商家帳號後5碼(5碼) = 29955 +

TimeStr(10碼) = 9328005018 +

TimeStr前4碼(4碼) = 9328 +

商家帳號前4碼(4碼) = 0282

加權權數(23碼) = 29955932800501893280282

將權數與基數相乘取其個位數字相加

加權算法

取個數分別得到並相加:

8 + 7 + 9 + 5 + 5 + 9 + 7 + 6 + 8 +0 + 0 + 5 + 0 + 3 + 8 + 1 + 9 + 2 + 2 + 0 + 2 + 2 + 6 = 104

104 / 10得餘數 4 :加權檢查碼 取 10 – 4 = 6

加權檢核碼 = 2995593280050186

※ 組成回覆PassCode時的加權檢核碼會以GP的規則替換

Code Example

//OP = GK

int intPN = 0;
int intCN = 0;
string PowerNum = "93193193193193193193193"; //加權數值
string BaseNum = ""; //加權基數
string CheckString = ""; //隨機檢查碼
string webno = mem_cid; //商家帳號

//判斷身分證取右邊9碼
if (Check_TW(mem_cid)) { webno = StrRight(mem_cid, 9); }

//判斷統編左補0
if (ValidBID(mem_cid)) { webno = StrRight("0" + mem_cid, 9); }

//取帳號的右邊5碼與時間戳字串合併
CheckString = StrRight (webno, 5) + TimeStr;

//設定加權基數 取得時間戳左4碼與帳號左四碼合併,並串接於CheckString 右側
BaseNum = CheckString + StrLeft(TimeStr, 4) + StrLeft (webno, 4);

//計算並取得隨機檢查碼
for (int i = 0; i <= 22; i++)
{
intPN = Convert.ToInt16(BaseNum.Substring(i, 1));
intCN = Convert.ToInt16(PowerNum.Substring(i, 1));
CheckNum += Convert.ToInt32(StrRight(Convert.ToString(intPN * intCN), 1));
}

//10與 隨機碼取10的餘數相減-若為10則取0
CheckNum = 10 - (CheckNum % 10);
CheckString += StrRight("0" + Convert.ToString(CheckNum), 1);

return CheckString

4.PassCode產生範例

GP 取得隨機檢查碼

mem_cidGP規則加權檢核碼串接後做SHA-1雜湊函數加密後轉大寫帶入

回覆時的PassCode規則:

mem_cidGK規則加權檢核碼串接後,以隨機檢查碼(CheckNum)為加密鑰HMACSHA256雜湊函數加密後轉大寫帶入

呼叫 OP=GP 回覆物件內容包含:mem_cid,TimeStr,PassCode,CheckNum

Sha256 Key即為CheckNum,回覆的範例如下,

Ex Response:

(TimeStr = 4211160609)

Mem_cid = 28229955

CheckStr = 0282242111606098

PassCode = 282299550282242111606098

PassCode-Sha256 >> 24551CB46438C363FB54CB670B6005EB98815AF67CCC52742891CBB32562D885

GK 取得Key及IV

mem_cidGK規則加權檢核碼串接後,以隨機檢查碼(CheckNum)為加密鑰HMACSHA256雜湊函數加密後轉大寫帶入

回覆時的PassCode規則:

mem_cidGP規則加權檢核碼串接後做SHA-1雜湊函數加密後轉大寫帶入

呼叫 OP=GK 回覆物件內容包含:PassCode, EncryptionKey, EncryptionIV

Response:

EncryptionKey = 73333029

EncryptionIV = encrypt282299550

PassCode = 282299552995542111606098

PassCode-Sha256 >> 0E73D6728F413B52010C1A82B3040B9B82F878B9C8214E635840B475673CDB33


5.SHA-1雜湊函數加密

說明

  • 雜湊函數產生之值,用於判定是否由我方或貴公司傳值給對方,以此方式避免有心人士從中攔截更改資料請使用ASCII做SHA-1輸出,輸出格式為十六進位

加密後Example

F6ACC37A32D592A90414E1AB0F3DE0DE4474B98A

Code Example

C# version

public string SHA1Encrypt(string data)
{
SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();
var keyBytes = Encoding.Default.GetBytes(data);
var hash = sha1.ComputeHash(keyBytes);
var result = BitConverter.ToString(hash).Replace("-", "")

return result;
}

6.HMACSHA256雜湊函數加密

Code Example

C# version

public string HMACSHA256Encrypt(string data)
{
byte[] ByteString = System.Text.Encoding.ASCII.GetBytes(Content);
byte[] ByteKeyString = Encoding.ASCII.GetBytes(Key);
byte[] HasBytes;

HMACSHA256 hmacsha256 = new HMACSHA256(ByteKeyString);
HasBytes = hmacsha256.ComputeHash(ByteString);

string ReturnStr = BitConverter.ToString(HasBytes).Replace("-", "").ToUpper();

return ReturnStr;
}

7.TripleDES加密

說明

加密前Example

"{"mem_cid":"28229955","mem_branchid":null,"mem_branchpw":"2822995506","mem_branchName":"PayNow 測試分店","mem_branchZipCode":"10478","mem_branchContactAdd":"台北市中山區民生東路3段19
12F","mem_branchContactName":"1111","mem_branchContactTel":"0225215088","mem_branchContactPhone":"0939849270","mem_branchContactEmail":"linahorng@gmail.com","mem_branchReturnURL":"https://test.paynow.com.tw/biller_return.aspx","mem_branchReturnOfflineURL":"https://test.paynow.com.tw/biller_return.aspx","mem_branchWebURL":"https://test.paynow.com.tw","IsAdoptAccount":true,"accountbankno":null,"mem_bankname":null,"mem_bankaccount":null,"mem_bankaccno":null,"PassCode":"ED7F1C09BFAFF5BEFE04043A4127FA978EC17DBB","ECplatform":"PayNow"}"

加密後Example

gv1ya+Tgv4YGR186pOIsyNOkmfV2Ixb8NEOxVBN3y404fBEZG8KjsbxcnCrM4ECDFsaIJZPS5y2ufrLSCVIJ4+FA4cDYr8/pNEO
xVBN3y41EdOBPJwxxmDgBzyc7tuifNFn8gIrtZ2CeVqiMtEj2kl+2ecp0DVjFhHncXo7lKdiIvCFO/oScS5DGlJd6vkhcNN/Ak81Fzzt
6lq3BhVQdpiKSHPbE1F0dIg3qG3c7hj/dTVfZrANfI6wx9bnYBQnxWcg2Ms+bgEKIaUzTBrYI7jRDsVQTd8uN7P2b3NvP/hgJtwC
85/W9yyLnOd9JAwF8Zykr2rovODPZUE+Cl+xzamAeDqXqiZ5WvoVH9828lhvEZhUJFT5Cg+267cj3UC2RTs7eq9ENgWvfKQno
ZkQthVmfSr0qczUZ/ro9o1mmiDZfvWxnXIHm3Lk/l+jzZL4nupaJAbsBUD6veQkgunwVCpAX+DCFEtQiNEOxVBN3y4317i8ocv
OIZXhy0WRd5SQ6lU49J94gykj6g/REuqlesZEbW+56N2tFHqvIA+1sgb2jRQudaCElg+YnTAZOg/57IoSOg/hN4qq+16rulblTCg5l
WgpWQ7ocie7qlDtEgIOsf4gz1dPddR7llncz4TxdkisoDDL6UidQHmHvyC2OsngICJPgoawhxGYVCRU+QoNFrduQjuWy8Hhy0W
Rd5SQ6lU49J94gykj6g/REuqlesQxM28hJWGJR0AydpG/DL6QYXcT25ZbtxND64l6JsnxW8q9AapSrDk6r13pHC2S+3P/pmX+kQe
XYSJGVrfdSAgsCVt3Aoo8omfMcjIVmiB0FGT6iK2iwe3F7g+Iv47odvEYkvolj8QXS5Rp43i9M91v3Nn1mH/iIpseWAVygLoVOsjn
nab4nhpdZ6KKmuytLhASSphQ0/j2xPv181jdRGdEI7YATlwPqNxOo4paoKr0u7Y0iQCsfh+ZuWiGofXLBZw==

公鑰為 12345678 私鑰為 123456789028229955123456,總共24碼(28229955為key值)


Code Example

  • C# version

    public string Encrypt(string content)
    {
    var keystr = "28229955";
    TripleDes.IV = Encoding.UTF8.GetBytes("12345678");
    TripleDes.Key = Encoding.UTF8.GetBytes("1234567890" + keystr + "123456");
    TripleDes.Mode = CipherMode.ECB;
    TripleDes.Padding = PaddingMode.Zeros;

    var data = Encoding.UTF8.GetBytes(content);
    var ict = TripleDes.CreateEncryptor();
    var enc = ict.TransformFinalBlock(data, 0, data.Length);
    var result = Convert.ToBase64String(enc).Replace(' ', '+');

    return result;
    }