Abstract
Encryption is a widely used solution to prevent privacy leakage and illegal spread when sensitive images are uploaded to cloud storage. Hiding technology also allows confidential data to be embedded into encrypted images for secret communication. As image accuracy without distortion is essential within certain fields (such as medicine and the military), sensitive images must be completely decrypted back into the original images. However, an encrypted image is a noise-like pattern that is meaningless to a user; thus, it is difficult for a user to find the accurate image they desire. Take keywords as search indexes and embed them in encrypted images for encrypted image retrieval as an example. This idea has been extended by Chen and Line’s scheme to achieve higher capacity with reversibility. The proposed scheme adjusts the coding results according to smooth and complex images to increase its hiding capacity. In addition, two thresholds are designed to adjust the predicted pixel value to be close to the original one. Experiments show that compared with the other schemes, the proposed method achieves superior results. In addition, a hidden encrypted image can be extracted from the cover image. Afterward, the hidden secrets can be completely extracted, and sensitive images can also be perfectly restored.
1. Introduction
Private web albums rely on a cloud service for owners to back up personal photos. This is a convenient but insecure platform that enables malicious users to illegally log in and obtain sensitive content for illegal dissemination. Image encryption offers a feasible solution to this potential security risk by allowing users to encrypt sensitive content into meaningless content before uploading it. To confirm the security and validity of image encryption, several techniques, such as compound homogeneous hyper-chaotic [1], Chaotic Map [2], and Rubik’s cube method [3], are applied to image encryption. An encrypted image exists in a kind of noise-like mode. Data cannot be obtained without the secret keys, even through statistical calculations. However, meaningless image content is difficult for the owner to manage. Data hiding can cleverly embed the search index into an encrypted image for subsequent image retrieval so that owners can efficiently find specific photos from a large number of encrypted images. In addition, privileged data, such as patient name or identity, can be embedded in encrypted images to preserve a patient’s privacy.
For some specific fields, such as medical and military fields, image distortion is unacceptable. Therefore, after extracting the hidden data, the medical image must be completely restored. Such methods are referred to as Reversible Data Hiding (RDH) methods [4,5,6,7]. When reversibility is applied to encrypted images, it is called the RDHEI method [8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32].
Zhang’s scheme [25] encrypts the most significant five bits (MSB) in the original pixel through XOR operation with the random bit stream. Later, it compresses the least significant bit (LSB) of the encrypted image to create space for embedding the secret. However, the embedding rate of the test image “Lena” is very low, only 0.017 bpp (bits per pixel). The decrypted image is similar to but not the same as the original image. Hong et al. [11] applied side matching information to improve the quality of restoration, which is about 1.21% higher than Zhang’s [25]. Qian et al. [16] used a progressive method to achieve concealment and recovery quality of 0.043 bpp and 38.1 dB, respectively. To increase confidentiality, Zhang [33] generated two different keys to encrypt images and hide messages in images; the keys were then distributed to different authorized users.
To achieve reversibility, Ma et al. [14] proposed a reversible data embedding scheme utilizing histogram shifting technology in encrypted images. Qian et al. [17] used error correction codes in Huffman coding to increase the amount of hidden information. Based on the pixel concept, which is similar to surrounding pixels, Cao et al. [8] compressed the image to make room for data embedding. However, the spatial correlation changed after the image was encrypted [12]. To resolve this shortcoming, Huang et al. [12] unitized a key design to maintain the spatial correlation even after image encryption. Zhou et al. [32] predicted pixels using neighboring pixels for secret embedding. Unfortunately, the pixels could be fully restored. In order to improve the security, the scheme [10,30] uses homomorphic encryption to encrypt the image. However, the scheme in [10,30] has low hiding capacity and encounters the problem of pixel expansion. Using the histogram shifting technique, Huang et al. [12] regard the MSB as the secret embedded in the LSB of the encrypted block.
To increase the hiding capacity, Yi et al. [22] utilized parameter binary tree labels to mark the redundant relationship between pixels and blocks. In Yi et al.’s scheme [22], the average hidden payload displayed based on the and block sizes were 1.752 and 2.003 bpp, respectively. Yin et al. [24] observed that the MSB of the original pixel and the predicted pixel are usually the same, which can be used to make room for secret embedding. In addition, Huffman coding is applied to reduce the size of the indicator, which is used to indicate the number of MSBs that can be leveraged to embed secrets per pixel. Yin et al.’s scheme [24] provides good pixel predictions to improve the hidden payload. However, an image encrypted through MSB prediction is easily decoded through statistical analysis [34]. To address this issue, a hiding and encryption method [35] integrated with Hamming coding is proposed in this paper. The MSB prediction can be shuffled using Hamming coding with a secret key. To achieve good pixel prediction, the proposed scheme designs two thresholds used in [24] to flexibly adjust the predicted value to be close to the original one. To improve the hiding capacity of the technique in [35], the Hamming code encoding is based on two different image types: smooth and complex images.
2. Proposed Scheme
The proposed scheme includes a secret embedding and encryption stage (in Section 2.1) and a secret extraction and decryption stage (in Section 2.2).
2.1. Secret Embedding and Encryption Stage
For clarity, the stage is divided into four steps, namely prediction, difference calculation, Hamming coding calculation and shuffling, and secret embedding and encryption. The details of each step are described as follows.
In the prediction step, since pixels are similar to their neighboring pixels, the pixels located in the first row and first column are regarded as unchanged seed pixels, named reference pixels, which are used to predict the neighboring pixels. Aside from the reference pixels, the predicted pixels represented by are calculated via Equation (1) based on the neighboring pixels of the pixel , where is the location of the pixel in the given image O, and are thresholds that control the predicted value close to . For example, as shown in Figure 1, the neighboring pixels of are , and and the corresponding pixel values are 100, 102 and 105, respectively. Because is less than and , will be 106 when is 1.
Figure 1.
A sample prediction for a complex image.
Next, in the difference calculation step, we use Equation (2) to convert and into two bitstreams. The k-th bits corresponding to and are respectively expressed as and , where “mod” is a modular operation. For example, if is equal to 108, then is 0. Then, Equation (3) is used to calculate the difference between the two numbers and , where ⊕ is the exclusive OR operation. As for the example shown in Figure 1, if and are 108 and 106, the result of Equation (3) is 00000110, denoted by . With Equation (4), the kth most significant bit of equal to 1 is denoted by . In the same example, if is equal to 00000110, the value will be 3. Next, is calculated with Equation (5) to represent the number of consecutive MSBs of the original pixel equal to that of its predicted pixel. For example, the value of is 5. In other words, in the example, five MSBs of the pixel can be predicted by . The value of the 6th MSB of can be recovered as the flipped value of . Thus, the MSB of the pixel can be used to hide the secret.
In the Hamming coding calculation and shuffling step, when applying Hamming coding matrix [36], we convert the into a bit stream as an indicator, depicted by (). Noted that since () can only appear in eight cases, but there are actually nine cases in the difference calculation, the cases are defined according to smooth and complex images. The image judges the type of image based on the higher capacity in the smooth type encoding or complex one. The image type (smooth and complex are marked as “s” and “c”, respectively) is treated as a parameter saved in the database. If it is a smooth image, values of equal to 0 and 1 fall into the same case. Therefore, with regard to the smooth image, the decimal value of the indicator () is the value of if is larger than 0 (the fallen cases are recorded under “Label” in Table 1). If it is a complex image, the values of equal to 7 and 8 fall into the same case; in such a situation, if is equal to 8, then the decimal value of () is adjusted to 7 (also recorded under “Label” in Table 1). For example, in Figure 1, the value generates the indicator () as 101 if the image is a complex image.
Table 1.
The pure payloads of the smooth image and complex image.
Essentially, the value can represent which case the pixel has fallen into, which indicates the hiding capacity. Next, the value of is assigned to Equation (7), and the values of , and can be found to make the condition satisfy the value of (as shown in Equation (7)). The Hamming coding matrix is used as the first round to shuffle the original values of to produce the values of , and . For example, if is equal to 5, will be 101. While satisfying Equation (7)), the values of , and will be 1, 1, and 0, respectively.
Subsequently, the value is recalculated as for the second round of shuffling with Equation (8), where is generated by a random number generator with the key . In the previous example, if the value of is 001, will be .
In the secret embedding and encryption step, the bit stream of the embedded pixel consists of three parts as shown in Figure 2, in which the embedded pixel is represented by . The first part is for the Hamming encoding code, which expresses which case the given pixel falls into. The first three MSBs of the embedded pixel equate to the second-round shuffling result .
Figure 2.
Three pieces of the embedded pixel.
As for the second part in Figure 2, the values of the “Payload” column in Table 1, depicted by , indicate the number of secret bits to-be embedded to the pixel . In this part, the hiding capacity for different types of images is listed in Table 1. Here, the fallen cases, the capacity, the code length, and pure payload are denoted by “Label”, “Capacity”, “Code length” and “Payload”, respectively. The column “Label” indicates the decimal value of the indicator (), “Capacity” refers to the amount of changeable bits for a given pixel, “Code length” is the code length of Hamming codes, and “Payload” represents the pure hiding capacity (i.e., the result of “Capacity” value minus the “Code length” value). For example, for a complex image, the payload is 3 if Label is 5 (i.e., ). If is less than 0, no secret data are hidden. In addition, the original MSBs of the pixel are regarded as part of the to-be hidden secret data, where is the absolute value of b. When is larger than 0, the second part of the , bits of the secret data, are equal to the values from the 4th MSB bit to the -th MSB bits of the . The third part is the last () bits of if is larger than 0; otherwise, the last five bits of the embedded pixel are kept the same as those of .
In the same example, can be constructed as 11100100, and the first 3 MSBs as 111; the second part for embedding bits of secret data (e.g., obtain three bits of the to-be hidden data (001 in this example), owing to the equal to 101 in Table 1); and the third part as the last (i.e., ) bits of the original pixel (i.e., the last two bits of original pixel are 00). If is less than 0, no data are hidden in this situation, and the 4th MSB onward to the last bit of is equal to that of . For clarity, the k position of the pixel is represented by . In the image encryption stage, the key generates a random number , where the k bit of is represented as . Finally, can be encrypted via Equation (9) with key . For example, if is 01011001, the encrypted pixel will be .
2.2. Secret Extraction and Decryption Phases
This phase consists of three steps: the decryption step, data extraction step, and recovery step.
In the decryption step, the keys and will generate random bits and . Using Equation (9), the encrypted pixel can be decrypted as , where is the random bit used to decrypt the k bits of pixel . Thus, the can be reconstructed as .
In the data extraction step, the value of can be obtained through Equation (8) key . In the same example, the values of and are 111 and 001, which output as . After that, the first 3 MSBs of the decrypted image are integrated as with predicted pixels , , and using Equation (7) to calculate . determines . The decimal of represents the indicator in column “Label” of Table 1. Mapping to a fallen case, if the corresponding value of is larger than 0, we can obtain the hidden data from the 4th MSB to the th MSB of as shown in the second piece of Figure 2. In contrast, if is less than 1, no secret data are extracted.
In the previous example, the predicted pixel is ; thus, the values of , , and are 0, 1, 1, 0, respectively. The value of m is constructed as by Equation (6). With Equation (7), the value of is 101. The decimal value of is equal to 5, which indicates equal to 3. In the example, the hidden data are extracted as 001 (from the 4th MSB to the 6th MSB of ).
The algorithm for the recovery step is shown in Algorithm 1. The value of “Capacity” in Table 1 (for clarity, the value depicted by , represents the number of bits that can be recovered from the predicted pixel). Furthermore, two recovery situations are for smooth images and complex images. For the smooth image, if equals 0, no bits of the predicted pixel can be used to recover the original pixel , and the original 3 MSBs of are recovered through the hidden data extracted by other pixels. As for a complex image, if is less than 1, the MSBs are also recovered by the hidden data extracted by other pixels. The 4th MSB onward to the last bit of is recovered by that of .
If is larger than 0, the first MSBs of the predicated pixel are the same as the first MSBs of the original pixel. In addition, the th MSB of is recovered by the flipped value of . The last bits of can be used to recover those of . That is, the th MSB of is equal to .
In the example, is 6. Thus, the original first five MSBs are recovered as 01101 and the 6th MSB bit can be restored as 1 (flip the 6th MSB of ). The remaining bits of can be used to recover that of as 00. Thus, the reconstructed pixel is 01101100 (i.e., 108).
| Algorithm 1 Recovering pseudo code |
|
3. Experimental Results
This section shows the experimental results and compares them with the results of [9,15,22,35,37,38]. Three test images: Lena, Baboon and Jetplane, as shown in Figure 3. In addition, the measured metric PSNR (Peak Signal-to-Noise Ratio), as seen in Equation (10), is used to evaluate the visual quality. After the image is encrypted, the encrypted results of Figure 3a–c are shown in Figure 3d–f, respectively. The encryption result is meaningless to users. The PSNRs of Figure 3d–f are 8.816, 9.524 and 8.677 dB, respectively. Figure 3g–i shows that the attacker used the wrong key to decrypt the image, and the PSNRs are 8.797, 9.507 and 8.656 dB, respectively.
Figure 3.
Test images and the corresponding encrypted and decrypted with wrong key images. (a) Lena. (b) Baboon. (c) Jetplane. (d) Encrypted result of (a). (e) Encrypted result of (b). (f) Encrypted result of (c). (g) Illegal decryption of (d). (h) Illegal decryption of (e). (i) Illegal decryption of (f).
Hidden capacity is expressed in bits per pixel (bpp). Table 2 shows the hiding capacity of the test images Lena, Baboon and Jetplane. Here, the field “Label” is mapped to the falling case according to the value of and the image type (smooth or complex image), and the “distribution” is the number of pixels classified into the same “Label”. “Payload” refers to pure payload. The payloads of the images Lena, Baboon and Jetplane are 2.58, 1.19 and 3.43 bpp, respectively, which are higher than those in [35]. In addition, the experiments showed that the prediction results for smooth images (such as Lena and Jetplane) were better than those for complex images (such as Baboon), which resulted in smooth images having greater hiding capacity than complex images did. Moreover, thresholds and settings are the flexible factors for different images to make the prediction pixel close to the original ones. The close prediction causes a better hiding capacity. Table 3 compares the payload (bpp) of the proposed scheme with the methods in [9,15,22,35,37,38]. The results show that the proposed method outperforms the six other algorithms.
Table 2.
The pure payloads of images “Lena”, “Baboon” and “Jetplane”.
Table 3.
Comparison of payload on three images.
4. Conclusions
Image encryption aims to encrypt sensitive data to protect privacy for the image owner. This paper proposes a reversible data embedding scheme using Hamming coding in encrypted images. On average, the code length is 3 bpp to expand the hiding capacity. In the experiment, the hiding capacity of the proposed scheme is greater than that in [9,15,22,35,37,38] for both smooth and complex types of images. In addition, the proposed technique enables an encrypted image to be completely restored to its original state after the hidden data are extracted.
Author Contributions
Formal analysis, P.-Y.L.; Methodology, Y.-H.C. and S.-H.C.; Visualization, S.-H.C.; Writing–original draft, Y.-H.C., P.-Y.L. and H.-P.W.; Writing–review and editing, H.-P.W. All authors have read and agreed to the published version of the manuscript.
Funding
This research was supported in part by the Ministry of Science and Technology of the Republic of China, Taiwan, under Grant MOST 107-2221-E-182 -081 -MY3 and MOST 110-2221-E-182-026-MY3, and in part by the Kaohsiung Chang Gung Memorial Hospital with grant number CMRPD3M0011.
Institutional Review Board Statement
Not applicable.
Informed Consent Statement
Not applicable.
Conflicts of Interest
The authors declare no conflict of interest.
References
- Zhu, H.; Zhang, X.; Yu, H.; Zhao, C.; Zhu, Z. An image encryption algorithm based on compound homogeneous hyper-chaotic system. Nonlinear Dyn. 2017, 89, 61–79. [Google Scholar] [CrossRef]
- Zhu, H.; Zhao, Y.; Song, Y. 2D logistic-modulated-sine-coupling-logistic chaotic map for image encryption. IEEE Access 2019, 7, 14081–14098. [Google Scholar] [CrossRef]
- Zhu, H.; Dai, L.; Liu, Y.; Wu, L. A three-dimensional bit-level image encryption algorithm with Rubik’s cube method. Math. Comput. Simul. 2021, 185, 754–770. [Google Scholar] [CrossRef]
- Coatrieux, G.; Le Guillou, C.; Cauvin, J.M.; Roux, C. Reversible watermarking for knowledge digest embedding and reliability control in medical images. IEEE Trans. Inf. Technol. Biomed. 2008, 13, 158–165. [Google Scholar] [CrossRef]
- Lee, S.; Yoo, C.D.; Kalker, T. Reversible image watermarking based on integer-to-integer wavelet transform. IEEE Trans. Inf. Forensics Secur. 2007, 2, 321–330. [Google Scholar] [CrossRef]
- Celik, M.U.; Sharma, G.; Tekalp, A.M.; Saber, E. Lossless generalized-LSB data embedding. IEEE Trans. Image Process. 2005, 14, 253–266. [Google Scholar] [CrossRef]
- Celik, M.U.; Sharma, G.; Tekalp, A.M. Lossless watermarking for image authentication: A new framework and an implementation. IEEE Trans. Image Process. 2006, 15, 1042–1049. [Google Scholar] [CrossRef]
- Cao, X.; Du, L.; Wei, X.; Meng, D.; Guo, X. High capacity reversible data hiding in encrypted images by patch-level sparse representation. IEEE Trans. Cybern. 2015, 46, 1132–1143. [Google Scholar] [CrossRef]
- Chen, K.; Chang, C.C. High-capacity reversible data hiding in encrypted images based on extended run-length coding and block-based MSB plane rearrangement. J. Vis. Commun. Image Represent. 2019, 58, 334–344. [Google Scholar] [CrossRef]
- Chen, Y.C.; Shiu, C.W.; Horng, G. Encrypted signal-based reversible data hiding with public key cryptosystem. J. Vis. Commun. Image Represent. 2014, 25, 1164–1170. [Google Scholar] [CrossRef]
- Hong, W.; Chen, T.S.; Wu, H.Y. An improved reversible data hiding in encrypted images using side match. IEEE Signal Process. Lett. 2012, 19, 199–202. [Google Scholar] [CrossRef]
- Huang, F.; Huang, J.; Shi, Y.Q. New framework for reversible data hiding in encrypted domain. IEEE Trans. Inf. Forensics Secur. 2016, 11, 2777–2789. [Google Scholar] [CrossRef]
- Liao, X.; Shu, C. Reversible data hiding in encrypted images based on absolute mean difference of multiple neighboring pixels. J. Vis. Commun. Image Represent. 2015, 28, 21–27. [Google Scholar] [CrossRef]
- Ma, K.; Zhang, W.; Zhao, X.; Yu, N.; Li, F. Reversible Data Hiding in Encrypted Images by Reserving Room before Encryption. IEEE Trans. Inf. Forensics Secur. 2013, 8, 553–562. [Google Scholar] [CrossRef]
- Puteaux, P.; Puech, W. An efficient MSB prediction-based method for high-capacity reversible data hiding in encrypted images. IEEE Trans. Inf. Forensics Secur. 2018, 13, 1670–1681. [Google Scholar] [CrossRef] [Green Version]
- Qian, Z.; Zhang, X.; Feng, G. Reversible data hiding in encrypted images based on progressive recovery. IEEE Signal Process. Lett. 2016, 23, 1672–1676. [Google Scholar] [CrossRef]
- Qian, Z.; Zhang, X.; Wang, S. Reversible data hiding in encrypted JPEG bitstream. IEEE Trans. Multimed. 2014, 16, 1486–1491. [Google Scholar] [CrossRef]
- Qian, Z.; Zhang, X. Reversible data hiding in encrypted images with distributed source encoding. IEEE Trans. Circuits Syst. Video Technol. 2015, 26, 636–646. [Google Scholar] [CrossRef]
- Wu, X.; Sun, W. High-capacity reversible data hiding in encrypted images by prediction error. Signal Process. 2014, 104, 387–400. [Google Scholar] [CrossRef]
- Xu, D.; Wang, R. Separable and error-free reversible data hiding in encrypted images. Signal Process. 2016, 123, 9–21. [Google Scholar] [CrossRef]
- Yi, S.; Zhou, Y. Binary-block embedding for reversible data hiding in encrypted images. Signal Process. 2017, 133, 40–51. [Google Scholar] [CrossRef]
- Yi, S.; Zhou, Y. Separable and reversible data hiding in encrypted images using parametric binary tree labeling. IEEE Trans. Multimed. 2019, 21, 51–64. [Google Scholar] [CrossRef]
- Yin, Z.; Abel, A.; Tang, J.; Zhang, X.; Luo, B. Reversible data hiding in encrypted images based on multi-level encryption and block histogram modification. Multimed. Tools Appl. 2017, 76, 3899–3920. [Google Scholar] [CrossRef]
- Yin, Z.; Xiang, Y.; Zhang, X. Reversible data hiding in encrypted images based on multi-MSB prediction and Huffman coding. IEEE Trans. Multimed. 2020, 22, 874–884. [Google Scholar] [CrossRef]
- Zhang, X. Reversible data hiding in encrypted image. IEEE Signal Process. Lett. 2011, 18, 255–258. [Google Scholar] [CrossRef]
- Zhang, X. Separable Reversible Data Hiding in Encrypted Image. IEEE Trans. Inf. Forensics Secur. 2012, 7, 826–832. [Google Scholar] [CrossRef]
- Zhang, W.; Ma, K.; Yu, N. Reversibility improved data hiding in encrypted images. Signal Process. 2014, 94, 118–127. [Google Scholar] [CrossRef]
- Zhang, X.; Qian, Z.; Feng, G.; Ren, Y. Efficient reversible data hiding in encrypted images. J. Vis. Commun. Image Represent. 2014, 25, 322–328. [Google Scholar] [CrossRef]
- Zhang, X.; Long, J.; Wang, Z.; Cheng, H. Lossless and reversible data hiding in encrypted images with public-key cryptography. IEEE Trans. Circuits Syst. Video Technol. 2015, 26, 1622–1631. [Google Scholar] [CrossRef]
- Zhang, W.; Wang, H.; Hou, D.; Yu, N. Reversible data hiding in encrypted images by reversible image transformation. IEEE Trans. Multimed. 2016, 18, 1469–1479. [Google Scholar] [CrossRef]
- Zheng, S.; Li, D.; Hu, D.; Ye, D.; Wang, L.; Wang, J. Lossless data hiding algorithm for encrypted images with high capacity. Multimed. Tools Appl. 2016, 75, 13765–13778. [Google Scholar] [CrossRef]
- Zhou, J.; Sun, W.; Dong, L.; Liu, X.; Au, O.C.; Tang, Y.Y. Secure reversible image data hiding over encrypted domain via key modulation. IEEE Trans. Circuits Syst. Video Technol. 2016, 26, 441–452. [Google Scholar] [CrossRef]
- Zhang, X.; Feng, G.; Ren, Y.; Qian, Z. Scalable coding of encrypted images. IEEE Trans. Image Process. 2012, 21, 3108–3114. [Google Scholar] [CrossRef]
- Dragoi, I.C.; Coltuc, D. On the security of reversible data hiding in encrypted images by MSB prediction. IEEE Trans. Inf. Forensics Secur. 2021, 16, 187–189. [Google Scholar] [CrossRef]
- Chen, Y.H.; Lin, P.Y. Integrated Hamming Coding Operation to Reversible Data Hiding Scheme for Encrypted Images. In Proceedings of the 22nd IEEE/ACIS International Fall Virtual Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD2021-Fall), Taichung, Taiwan, 24–26 November 2021. [Google Scholar]
- Greenwald, S.W. Matrix Multiplication with Asynchronous Logic Automata. Ph.D. Thesis, Massachusetts Institute of Technology, Cambridge, MA, USA, 2010. [Google Scholar]
- Puteaux, P.; Puech, W. EPE-based huge-capacity reversible data hiding in encrypted images. In Proceedings of the 2018 IEEE International Workshop on Information Forensics and Security (WIFS), Hong Kong, China, 11–13 December 2018; pp. 1–7. [Google Scholar]
- Puyang, Y.; Yin, Z.; Qian, Z. Reversible data hiding in encrypted images with two-MSB prediction. In Proceedings of the 2018 IEEE International Workshop on Information Forensics and Security (WIFS), Hong Kong, China, 11–13 December 2018; pp. 1–7. [Google Scholar]
Publisher’s Note: MDPI stays neutral with regard to jurisdictional claims in published maps and institutional affiliations. |
© 2022 by the authors. Licensee MDPI, Basel, Switzerland. This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license (https://creativecommons.org/licenses/by/4.0/).