digraph "STAP-A -> FU-A" {
    node [shape=record];
    graph [ splines = line ];
    SA  [label="{STAP-A Type
              | {<f> F |<n> NRI |<t> Type } }
              | {<d1> STAP-A Data 1}
              | {<dx> STAP-A Data ...}
              | {<dn> STAP-A Data N}"
        ];
    FU  [label="{<i> N}| {FU-A Indicator | {<f> F |<n> NRI | Type(28) } } | {FU-A Header | {<s> S(1) | E(0) | R(0) | <t> Type } }| {<p> FU-A Payload}"];
    FUx [label="{<i> N + ...} | {FU-A Indicator | {<f> F |<n> NRI | Type(28) } } | {FU-A Header | {S(0) | E(0) | R(0) | <t> Type } } | {<p> FU-A Payload}"];
    FUn [label="{<i> N + n} | {FU-A Indicator | {<f> F |<n> NRI | Type(28) } } | {FU-A Header | {S(0) |<e> E(1) | R(0) | <t> Type } } | {<p> FU-A Payload}"];
    FU:i -> FUx:i;
    FUx:i -> FUn:i;
    SA:f -> FU:f [color="DodgerBlue" ];
    SA:f -> FUx:f [color="DodgerBlue" ];
    SA:f -> FUn:f [color="DodgerBlue" ];
    SA:n -> FU:n [color="Blue" ];
    SA:n -> FUx:n [color="Blue" ];
    SA:n -> FUn:n [color="Blue" ];
    SA:t -> FU:t [color="Green" ];
    SA:t -> FUx:t [color="Green" ];
    SA:t -> FUn:t [color="Green" ];
    SA:d1 -> FU:p [label="第一段" color="Red" ];
    SA:dx -> FUx:p [label="第...段" color="Red" ];
    SA:dn -> FUn:p [label="最后一段" color="Red" ];
}


allowmixing

rectangle "密钥" as key {
  rectangle "ASN.1" as ASN1

  rectangle CER
  rectangle DER
  rectangle PER
  rectangle XER

  rectangle PEM

  rectangle symKey [
    对称密钥
    ....
    如:DES、3DES、AES
    ----
    速度快,但是安全性相对差
  ]

  rectangle asymKey [
    非对称密钥
    ....
    如:RSA、DSA
    ----
    速度慢,但是安全性相对高
  ]

  rectangle pubKey #aliceblue;line:blue;line.dotted;text:blue [
    公钥
  ]

  rectangle privKey #aliceblue;line:blue;line.dotted;text:blue [
    私钥
  ]

  rectangle p1 #aliceblue;line:blue;line.dotted;text:blue [
    PKCS #1
    ....
    是专门为 RSA 密钥进行定义的
  ]
  rectangle p8 #aliceblue;line:blue;line.dotted;text:blue [
    PKCS #8
    ....
    为 RSA 和其它密钥所使用
  ]

  rectangle os_rsa #pink;line:red;line.bold;text:red [
    openssl genrsa
      -<cipher>
      -passout pass:1234
      -out server.key 2048
    ....
    生成私钥文件
    ----
    “<cipher>”的可选项参照“man openssl-genrsa”。
    它是用来加密密钥自身的。
  ]
  rectangle os_rsa_pub #pink;line:red;line.bold;text:red [
    openssl rsa
      -in server.key
      -pubout -out server.pub.key
    ....
    通过私钥文件生成公钥文件
  ]
  rectangle os_key #pink;line:red;line.bold;text:red [
    openssl genpkey
      -algorithm RSA
      -out privatekey.key
      -pass pass:1234
      -des-ede3-cbc
  ]
  rectangle os_enc_key #pink;line:red;line.bold;text:red [
    openssl aes-256-cbc
      -e -pbkdf2 -in input.txt -base64 -md sha256
      -K 123 -iv 456 -S 789
      > output.txt
    ....
    对称加密(-e)没有所谓的密钥文件,只有类似密钥的东西.
    也就是Salt(-S)、IV(-iv)、Key(-K)。
    注意:示例使用了123、456、789。真实的密钥要非常复杂。
    实际上这么简单的密钥几乎和没有加密是一样的。
  ]
  rectangle os_dec_key #pink;line:red;line.bold;text:red [
    openssl aes-256-cbc
      -d -pbkdf2 -in output.txt -base64 -md sha256
      -K 123 -iv 456 -S 789
      > input.txt
    ....
    使用同样的Salt(-S)、IV(-iv)、Key(-K)解密(-d)。
  ]
  rectangle os_enc_p2k #pink;line:red;line.bold;text:red [
    openssl aes-256-cbc
      -e -pbkdf2 -md sha256 -P
      -k 1234
    ....
    OpenSSL提供了一个方法,通过一个密码(-k)随机生成一组Salt、IV、Key。
  ]
  rectangle os_enc_ps #pink;line:red;line.bold;text:red [
    openssl aes-256-cbc
      -e -pbkdf2 -in input.txt -base64 -md sha256
      -k 1234
      > output.txt
    ....
    同样的,也可以直接使用密码加(-e)解(-d)密。
  ]
}

asymKey --> ASN1

ASN1 -- CER
ASN1 -- DER
ASN1 -- PER
ASN1 -- XER

DER --> PEM : Base64编码
PEM --> DER : Base64解码

PEM --> pubKey
pubKey --> p1
pubKey --> p8

PEM --> privKey
privKey --> p1
privKey --> p8

symKey --> os_enc_key
os_enc_key --> os_dec_key

symKey --> os_enc_p2k
os_enc_p2k --> os_enc_ps

p1 --> os_rsa
os_rsa --> os_rsa_pub
p8 --> os_key